Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/228.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
了解PHP'的结果;s mb_detect_编码和mb_check_编码函数_Php_Character Encoding_Windows 1252 - Fatal编程技术网

了解PHP'的结果;s mb_detect_编码和mb_check_编码函数

了解PHP'的结果;s mb_detect_编码和mb_check_编码函数,php,character-encoding,windows-1252,Php,Character Encoding,Windows 1252,我试图理解这两个函数和的逻辑,但是文档很差。从一个非常简单的测试字符串开始 $string = "\x65\x92"; 当使用Windows-1252编码时,它是小写字母“a”,后跟一个卷曲引号 我得到以下结果: mb_detect_encoding($string,"Windows-1252"); // false mb_check_encoding($string,"Windows-1252"); // true mb_detec

我试图理解这两个函数和的逻辑,但是文档很差。从一个非常简单的测试字符串开始

$string = "\x65\x92";
当使用Windows-1252编码时,它是小写字母“a”,后跟一个卷曲引号

我得到以下结果:

mb_detect_encoding($string,"Windows-1252"); // false
mb_check_encoding($string,"Windows-1252"); // true
mb_detect_encoding($string,"ISO-8859-1"); // ISO-8859-1
mb_check_encoding($string,"ISO-8859-1"); // true
mb_detect_encoding($string,"UTF-8",true); // false
mb_detect_encoding($string,"UTF-8"); // UTF-8
mb_check_encoding($string,"UTF-8"); // false
  • 我不明白为什么
    mb_detect_编码
    给出字符串“ISO-8859-1”而不是“Windows-1252”,而根据和,字节
    x92
    是在Windows-1252字符编码中定义的,而不是在ISO-8859-1中定义的

  • 其次,我不明白
    mb\u-detect\u-encoding
    如何返回
    false
    ,但是
    mb\u-check\u-encoding
    对于相同的字符串和字符编码可以返回
    true

  • 最后,我不明白为什么字符串可以被检测为UTF-8,严格模式与否。字节
    x92
    是UTF-8中的一个连续字节,但在这个字符串中,它位于有效字符字节之后,而不是序列的前导字节


您的示例很好地说明了为什么
mb\u detect\u编码
应该少用,因为它不直观,有时在逻辑上是错误的。如果必须使用它,始终传入
strict=true
作为第三个参数(因此非UTF8字符串不会报告为UTF-8)

在所需编码的数组上运行
mb_check_encoding
更可靠一些,按照可能性/优先级的顺序。例如:

$encodings = [
    'UTF-8',
    'Windows-1252',
    'SJIS',
    'ISO-8859-1',
];

$encoding = 'UTF-8';
$string = 'foo';
foreach ($encodings as $encoding) {
    if (mb_check_encoding($string, $encoding)) {
        // We'll assume encoding is $encoding since it's valid
        break;
    }
}
不过,顺序取决于您的优先级