在PHP中测试UTF8字符串,这是一种可靠的方法吗?

Gar*_*hby 5 php string utf-8

我在另一个答案中找到了一个有用的功能,我想知道是否有人可以向我解释它在做什么以及它是否可靠.我正在使用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字符串的可靠方法吗?到底是做什么的?它可以变得更强大吗?

dec*_*eze 6

如果您不知道字符串的编码,则无法以任何精度猜测编码.这就是为什么mb_detect_encoding根本不起作用.但是,如果你知道字符串应该是什么编码,你可以检查它是否是该编码中的有效字符串mb_check_encoding.它或多或少都与你的正则表达式有关,可能更全面一些.它可以回答这个问题"这个字节序列在UTF-8中是否有效?" 明确是或否.这并不一定意味着字符串实际上在该编码中编码的,只是它可能是.例如,使用8位来区分使用所有8位的任何单字节编码与任何其他单字节编码是不可能的.但是UTF-8 应该是相当可区分的,尽管你可以产生例如拉丁语1编码的字符串,这些字符串也恰好是有效的UTF-8字节序列.

简而言之,没有办法确切知道.如果您期望UTF-8,请检查您收到的字节序列是否在UTF-8中有效,那么您可以将该字符串安全地视为UTF-8.除此之外,你几乎无能为力.

  • “Hello World”是有效的 ASCII *和* Latin-1 *和* UTF-8! (3认同)
  • [在与他们合作之前,您真正需要了解的编码方式](http://kunststube.net/encoding). (2认同)