我正在尝试将字符串从iso-8859-1转换为utf-8。 但当我发现这两个charachter€和•函数返回 一个charachter,是一个内有两个数字的正方形。
我该如何解决这个问题?
答案 0 :(得分:8)
我认为您正在寻找的编码是Windows code page 1252(西欧)。它与ISO-8859-1(或8859-15)不同; 0xA0-0xFF范围内的字符与8859-1匹配,但cp1252在0x80-0x9F范围内添加了各种额外字符,其中ISO-8859-1分配了很少使用的控制代码。
出现混淆是因为当您将页面作为text/html;charset=iso-8859-1
投放时,由于历史原因,浏览器实际上使用cp1252(因此也会在cp1252中提交表单)。
iconv('cp1252', 'utf-8', "\x80 and \x95")
-> "\xe2\x82\xac and \xe2\x80\xa2"
答案 1 :(得分:1)
请务必先检查您的编码!你永远不应该盲目信任你的编码(即使它来自你自己的网站!):
function convert_cp1252_to_utf8($input, $default = '') {
if ($input === null || $input == '') {
return $default;
}
// https://en.wikipedia.org/wiki/UTF-8
// https://en.wikipedia.org/wiki/ISO/IEC_8859-1
// https://en.wikipedia.org/wiki/Windows-1252
// http://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WINDOWS/CP1252.TXT
$encoding = mb_detect_encoding($input, array('Windows-1252', 'ISO-8859-1'), true);
if ($encoding == 'ISO-8859-1' || $encoding == 'Windows-1252') {
/*
* Because ISO-8859-1 and CP1252 are identical except for 0x80 through 0x9F
* and control characters, always convert from Windows-1252 to UTF-8.
*/
$input = iconv('Windows-1252', 'UTF-8//IGNORE', $input);
}
return $input;
}
答案 2 :(得分:0)
iso-8859-1不包含€符号,因此如果包含iso-8859-1,则无法用iso-8859-1解释。请改用iso-8859-15。
答案 3 :(得分:0)
这两个字符在iso-8859-1中是非法的(你的意思是iso-8859-15?)
$ php -r 'echo iconv("utf-8","iso-8859-1//TRANSLIT","ter € and • the");'
ter EUR and o the