繁体   English   中英

PHP URLDecode / UTF8_Encode字符集特殊字符问题

[英]PHP URLDecode / UTF8_Encode Character Set Issues with special characters

我正在将一个英镑符号£传递给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("£")utf8_encode("£")我按预期获得£

我怎么解决这个问题?

如果你试试

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

你会看到的

string(2) "£"

因为这是2字节字符,而ord()返回第一个字符的值(194 =Â)

我不认为ord()是多字节兼容的。 它可能只返回字符串中第一个字符的代码,即Â。 在调用ord()之前尝试utf8_decode()字符串,看看是否有帮助。

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

关于urldecode和UTF-8的一些信息可以在urldecode文档的第一条评论中找到。 这似乎是一个众所周知的问题。

关于php.net for urlencode()的第一条评论 解释了为什么会这样,并建议使用此代码进行更正:

<?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或其他编码,否则您将继续在代码中使用££字符。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM