检测到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),但是我很想知道为什么会这样。