可能重复:
Detect file encoding in PHP
如何用PHP找出文件编码的文件?
最佳答案
对于所有8位字符集,检测编码确实很困难,但是utf-8(因为不是每个8位字节序列都是有效的utf-8)通常需要检测编码的文本的语义知识。
想想看:任何特定的纯文本信息只是一堆字节,没有相关的编码信息。如果你看任何一个特定的字节,它可能意味着任何东西,所以要有机会检测编码,你必须在其他字节的上下文中看这个字节,并尝试一些基于可能的语言组合的启发式方法。
对于8位字符集,你永远不能确定。
这里有一个启发式出错的演示,例如:
http://www.hoax-slayer.com/bush-hid-the-facts-notepad.html
有些16位集,您有机会检测,因为它们可能包含字节顺序标记,或者每秒钟将字节设置为0。
如果您只想检测UTF-8,您可以使用已经解释过的MbAdExcTebug编码,或者您可以使用这个方便的小函数:
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);
}