我正在将一个英镑符号£
传递给PHP页面,该页面已被ASP作为%C2%A3
进行URLE编码。
问题:
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("£")
正在按预期获得£
我该如何解决这个问题?
答案 0 :(得分:3)
如果你尝试
var_dump(urldecode("%C2%A3"));
你会看到
string(2) "£"
因为这是2字节字符而ord()返回第一个字符的值(194 =Â)
答案 1 :(得分:3)
我认为ord()
不是多字节兼容的。它可能只返回字符串中第一个字符的代码,即Â。在调用utf8_decode()
之前尝试ord()
字符串,看看是否有帮助。
ord(utf8_decode(urldecode("%C2%A3"))); // This returns 163
答案 2 :(得分:2)
有关urldecode和UTF-8的一些信息可以在the first comment of the urldecode documentation中找到。这似乎是一个众所周知的问题。
答案 3 :(得分:-1)
php.net上的first comment for 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或其他编码,否则您将继续在代码中使用££字符。