2011-04-05 115 views
3

我将一个英镑符号£传递给一个已被URLEncoded编码为%C2%A3的PHP页面。PHP URLDecode/UTF8_Encode字符集特殊字符集问题

问题:

urldecode("%C2%A3") // £ 
ord(urldecode("%C2%A3")) // get the character number - 194 
ord("£") // 163 - somethings gone wrong, they should match 

这意味着,当我utf8_encode(urldecode("%C2%A3"))我得到£

但是做utf8_encode("£")我得到£预期

我该如何解决这个问题?

回答

3

的价值我不认为ord()是多字节兼容的。它可能只返回字符串中第一个字符的代码,即Â。尝试utf8_decode()字符串,然后致电ord()并查看是否有帮助。

ord(utf8_decode(urldecode("%C2%A3"))); // This returns 163 
+0

谢谢,这个排序我的问题,绕$ _POST [“myvar”]包裹utf8_decode(),它的所有工作如预期 – Marcus 2011-04-05 10:32:26

3

如果您尝试

var_dump(urldecode("%C2%A3")); 

你会看到

string(2) "£" 

,因为这是2字节字符和ord()返回第一个(194 = A)

+0

为什么ord(“£”)返回163?我的代码的其余部分工作正常,如果我硬编码“英镑”,所以我正在寻找PHP认识到这一点字符163 – Marcus 2011-04-05 10:29:27

+0

因为你自己键入它。 – Arkh 2011-04-05 10:30:45

+0

@Arkh那没什么帮助,因为我试图让PHP识别POSTED变量“£”作为字符163. – Marcus 2011-04-05 10:33:16

1

关于urldecode和UTF-8的一些资讯可以在the first comment of the urldecode documentation找到。这似乎是一个已知的问题。

+0

很棒!这似乎描述了这个问题。 – Marcus 2011-04-05 10:34:11

+0

这不是一个问题,也不是PHP中的错误。评论指的是由于缺少UTF8元标记/标题而可能发生的错误客户端编码。如果您尝试修复这样的错误请求,您会得到意想不到的结果。 – Phil 2016-09-05 15:54:00

-1

上php.net的first comment的urlencode()来explains这是为什么,并建议该代码更正它:

<?php 
function to_utf8($string) { 
// From http://w3.org/International/questions/qa-forms-utf-8.html 
    if (preg_match('%^(?: 
     [\x09\x0A\x0D\x20-\x7E]   # ASCII 
    | [\xC2-\xDF][\x80-\xBF]    # non-overlong 2-byte 
    | \xE0[\xA0-\xBF][\x80-\xBF]   # excluding overlongs 
    | [\xE1-\xEC\xEE\xEF][\x80-\xBF]{2} # straight 3-byte 
    | \xED[\x80-\x9F][\x80-\xBF]   # excluding surrogates 
    | \xF0[\x90-\xBF][\x80-\xBF]{2}  # planes 1-3 
    | [\xF1-\xF3][\x80-\xBF]{3}   # planes 4-15 
    | \xF4[\x80-\x8F][\x80-\xBF]{2}  # plane 16 
)*$%xs', $string)) { 
     return $string; 
    } else { 
     return iconv('CP1252', 'UTF-8', $string); 
    } 
} 
?> 

你也应该据此决定是否你希望你的最终的HTML发送到浏览器是在utf-8或其他编码中,否则您将继续在您的代码中出现英文字母。

+0

正在将数据传递给内置类的PHP,该类需要UTF-8编码。你看到任何理由使用该函数,而不是utf8_decode()? – Marcus 2011-04-05 10:45:06

+0

因为%C2%A3不是utf-8 - utf-8-pund会是%20%A4。你从ASP-Code获得的是iso-8859-1字符。 这个函数检查一个字符串是否是有效的utf-8,如果没有,它将它转换为utf8。还使用utf8_decode()给你iso-8859-1字符而不是utf-8字符。 – Dexter 2011-04-05 12:59:46

+0

这个函数只是猜测编码,如果没有找到任何utf8字符,就执行一个utf8_encode。如果你在源头解决问题,你永远不需要这样的事情。 – Phil 2016-09-05 15:48:46