首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在PHP中检测正确的字符编码?

在PHP中检测正确的字符编码?
EN

Stack Overflow用户
提问于 2013-04-05 21:57:10
回答 2查看 3.5K关注 0票数 5

我试图检测字符串的字符编码,但无法得到正确的结果。

例如:

代码语言:javascript
复制
$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。

代码语言:javascript
复制
$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') ;

我又得到了错误的结果。

EN

回答 2

Stack Overflow用户

发布于 2014-04-23 13:46:37

PHP中Windows1252的问题是它几乎永远不会被检测到,因为一旦文本包含0x80到0x9f之外的任何字符,它就不会被检测为Windows1252。

这意味着如果您的字符串包含像"A“这样的普通ASCII字母,甚至是空格字符,PHP会说这是无效的Windows-1252,在您的情况下,返回到下一个可能的编码,即ISO 8859-1。这是一个PHP,请参阅https://bugs.php.net/bug.php?id=64667

票数 2
EN

Stack Overflow用户

发布于 2013-04-05 22:01:28

虽然使用ISO-8859-1和CP-1252编码的字符串具有不同的字节代码表示形式:

代码语言:javascript
复制
<?php
$str = "&euro; &sbquo; &fnof; &bdquo; &hellip;" ;
foreach (array('Windows-1252', 'ISO-8859-1') as $encoding)
{
    $new = mb_convert_encoding($str, $encoding, 'HTML-ENTITIES');
    printf('%15s: %s detected: %10s explicitly: %10s',
        $encoding,
        implode('', array_map(function($x) { return dechex(ord($x)); }, str_split($new))),
        mb_detect_encoding($new),
        mb_detect_encoding($new, array('ISO-8859-1', 'Windows-1252'))
    );
    echo PHP_EOL;
}

结果:

代码语言:javascript
复制
Windows-1252: 802082208320842085 detected:            explicitly: ISO-8859-1
  ISO-8859-1: 3f203f203f203f203f detected:      ASCII explicitly: ISO-8859-1

...from,我们在这里可以看到,看起来mb_detect_encoding的第二个参数有问题。使用mb_detect_order代替参数会产生非常相似的结果。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15844295

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档