检测 PHP 中没有多字节扩展的编码?

Detect encoding in PHP without multibyte extension?

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

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

总有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>

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

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

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

有关详细信息,请参阅:The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets