【发布时间】:2012-03-31 11:41:23
【问题描述】:
我在另一个答案中找到了一个有用的功能,我想知道是否有人可以向我解释它在做什么以及它是否可靠。我使用的是 mb_detect_encoding(),但在 Linux 操作系统上读取 ISO 8859-1 文件时它不正确。
这个功能似乎在我测试的所有情况下都有效。
这里是问题:Get file encoding
函数如下:
function isUTF8($string){
return preg_match('%(?:
[\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);
}
这是检测 UTF-8 字符串的可靠方法吗? 它到底在做什么?它可以变得更健壮吗?
【问题讨论】:
-
为什么不使用
mb_detect_encoding(php.net/manual/en/function.mb-detect-encoding.php) 之类的东西? -
只想提一下,这个函数认为“1”字符串不是utf8,而它是(要明确它只是一个ascii,但它仍然应该并入utf8)跨度>
-
@summea 你读过这个问题了吗?
-
@GaryWilloughby 读过这个问题,但我不记得你之前使用过
mb_detect_encoding;对于那个很抱歉。我仍然认为在这里使用mb_detect_encoding是值得的,尽管......即使它被包裹在其他东西中。看看 Greg Tisza 的评论,如果你有机会,关于使用“严格模式”(php.net/manual/en/function.mb-detect-encoding.php#102510) -
应该注意,问题中发布的函数实际上并未检测任意字符串是否为有效的 UTF-8。它只检测字符串是否包含“UTF-8 范围内的非 ascii 多字节序列”。因此,像“hello world”这样的普通 ascii 字符串将无法通过测试。有关该功能来自何处的更详细说明,请参阅下面的答案。