我在另一个答案中找到了一个有用的功能,我想知道是否有人可以向我解释它在做什么以及它是否可靠.我正在使用mb_detect_encoding()但是在从Linux操作系统上的ISO8859-1文件中读取时它已被删除.
这个功能似乎适用于我测试过的所有情况.
这是一个问题:获取文件编码
这是功能:
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);
}
Run Code Online (Sandbox Code Playgroud)
这是检测UTF8字符串的可靠方法吗?到底是做什么的?它可以变得更强大吗?
如果您不知道字符串的编码,则无法以任何精度猜测编码.这就是为什么mb_detect_encoding根本不起作用.但是,如果你知道字符串应该是什么编码,你可以检查它是否是该编码中的有效字符串mb_check_encoding.它或多或少都与你的正则表达式有关,可能更全面一些.它可以回答这个问题"这个字节序列在UTF-8中是否有效?" 明确是或否.这并不一定意味着字符串实际上是在该编码中编码的,只是它可能是.例如,使用8位来区分使用所有8位的任何单字节编码与任何其他单字节编码是不可能的.但是UTF-8 应该是相当可区分的,尽管你可以产生例如拉丁语1编码的字符串,这些字符串也恰好是有效的UTF-8字节序列.
简而言之,没有办法确切知道.如果您期望UTF-8,请检查您收到的字节序列是否在UTF-8中有效,那么您可以将该字符串安全地视为UTF-8.除此之外,你几乎无能为力.