我正在尝试检测字符串的字符编码,但我无法得到正确的结果.
例如:
$str = "€ ‚ ƒ „ …" ;
$str = mb_convert_encoding($str, 'Windows-1252' ,'HTML-ENTITIES') ;
// Now $str should be a Windows-1252-encoded string.
// Let's detect its encoding:
echo mb_detect_encoding($str,'Windows-1252, ISO-8859-1, UTF-8') ;
该代码输出ISO-8859-1但它应该是Windows-1252.
这有什么问题?
编辑:
更新了示例,以响应@ raina77ow.
$str = "€‚ƒ„…" ; // no white-spaces
$str = mb_convert_encoding($str, 'Windows-1252' ,'HTML-ENTITIES') ;
$str = "Hello $str" ; // let's add some ascii characters
echo mb_detect_encoding($str,'Windows-1252, ISO-8859-1, UTF-8') ;
我又得到了错误的结果.
解决方法:
PHP中Windows-1252的问题在于它几乎永远不会被检测到,因为只要文本包含0x80到0x9f之外的任何字符,它就不会被检测为Windows-1252.
这意味着如果你的字符串包含一个普通的ASCII字母,如“A”,甚至是一个空格字符,PHP会说这不是有效的Windows-1252,在你的情况下,它会回退到下一个可能的编码,即ISO 8859-1.这是一个PHP错误,请参阅https://bugs.php.net/bug.php?id=64667.