【问题标题】:Detect encoding in PHP without multibyte extension?在没有多字节扩展的情况下检测 PHP 中的编码?
【发布时间】:2015-10-08 20:24:20
【问题描述】:

有没有办法在不加载 mbstring 扩展的情况下检测 PHP 中字符串的编码?我知道使用mb_detect_encoding() 可以做到这一点,但是是否有等效的非多字节函数?

如果没有,实现一个至少可以检测 UTF-8 的 detect_encoding() 函数需要什么?

【问题讨论】:

  • 检测编码并不容易。一个仅使用 0-127 个字符的普通 ascii 文件也是一个完全有效的 utf-8 文件,但你不能说它是用 utf 或老式 ascii 构建的,因为两者无法区分。您可以执行诸如查找 BOM 之类的操作,但并非所有文件都有。

标签: php encoding utf-8 multibyte


【解决方案1】:

PHP 中的字符串只是字节序列,它们不携带任何编码信息。 mb_detect_encoding 实际上并没有检测到字符串的编码,它试图通过针对一系列识别函数运行字节序列来做出有根据的猜测,每个编码一个(默认情况下由mb_detect_order 给出),并返回第一个其中序列匹配。这些函数是非常基本的,甚至对于许多流行的编码都不存在。

无论有没有 mbstring 扩展,都无法确定字符串的编码 - 只能可能排除一些,只有当字符串恰好包含字节序列时才能这样做这在那些特定的编码中是无效的。

你永远不会知道 "\xC2\xA4" 应该是 UTF-8 ¤ 还是 ISO-8859-1 ¤,因为它们是完全相同的字节。

更多信息请见:The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets

【讨论】:

  • 感谢您提供的信息。对于我的问题的最后一部分,你的逻辑应该可以检测到一个字符串不是 utf8,对吗?那会是什么样子?
【解决方案2】:

总有iconv,一般在PHP中默认开启

<pre>
<?php
iconv_set_encoding("internal_encoding", "UTF-8");
iconv_set_encoding("output_encoding", "ISO-8859-1");
var_dump(iconv_get_encoding('all'));
?>
</pre>

【讨论】:

  • 我绝对不知道这些方法,但我需要一种专门测试字符串的方法
猜你喜欢
  • 2021-05-18
  • 2014-05-05
  • 1970-01-01
  • 2017-07-19
  • 2011-01-22
  • 2011-08-01
  • 2014-03-03
  • 2014-12-26
  • 1970-01-01
相关资源
最近更新 更多