mbstring为什么不能将latin1字符检测为cp1252?

时间:2019-01-07 12:44:36

标签: php character-encoding

检测到ASCII字符为有效的latin1,但未检测到cp1252

mb_detect_encoding("a",["ISO-8859-1"],true);   // "ISO-8859-1"  
mb_detect_encoding("a",["Windows-1252"],true); // false

可以检测到80-9F范围内的其他字符:

mb_detect_encoding("\x80",["ISO-8859-1"],true);   // "ISO-8859-1"  
mb_detect_encoding("\x80",["Windows-1252"],true); // "Windows-1252"

但普通扩展字符不是。在é处输入0xE9字符。 PHP将其检测为ISO,但未检测到超集:

mb_detect_encoding("\xE9",["ISO-8859-1"],true);   // "ISO-8859-1"  
mb_detect_encoding("\xE9",["Windows-1252"],true); // false

要将其他字符转换为UTF-8,需要使用Windows字符集,该字符集可以按预期工作:

mb_convert_encoding("a\xE9\x80","UTF-8","Windows-1252"); // aé€
mb_convert_encoding("a\xE9\x80","UTF-8","ISO-8859-1");   // aé<control>

我可以忍受这种限制(检测为ISO,转换为Windows),但是我很想知道为什么会这样。

0 个答案:

没有答案