了解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
- 我不明白为什么
给出字符串“ISO-8859-1”而不是“Windows-1252”,而根据和,字节mb_detect_编码
是在Windows-1252字符编码中定义的,而不是在ISO-8859-1中定义的x92
- 其次,我不明白
如何返回mb\u-detect\u-encoding
,但是false
对于相同的字符串和字符编码可以返回mb\u-check\u-encoding
true
- 最后,我不明白为什么字符串可以被检测为UTF-8,严格模式与否。字节
是UTF-8中的一个连续字节,但在这个字符串中,它位于有效字符字节之后,而不是序列的前导字节x92
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;
}
}
不过,顺序取决于您的优先级