我有一个包含联系人的大型CSV文件,所有非拉丁字符都显示如下:
ZüÂrich(苏黎世)
GrÃÂ'ne(Grône)
Chesières(Chesières)
Genève(日内瓦)
我尝试用正确的字符替换它们,例如:
str_replace('ü', 'ü', $string);
它们没有改变,我试图将它们插入MySQL数据库然后替换它们,它们仍然是相同的。
我该怎么办?
答案 0 :(得分:3)
请检查文件的编码。 一旦你知道它,你就可以以正确的方式阅读它。
之后,您可以将编码转换为UTF-8。
答案 1 :(得分:1)
根据@tadman描述的内容,以及我系统中已知的132种编码,有几种组合可能导致这种mojibake。
65001 utf-8 | 1252 iso-8859-1 | 65001 utf-8 | 1252 iso-8859-1
65001 utf-8 | 1252 iso-8859-1 | 65001 utf-8 | 1254 iso-8859-9
65001 utf-8 | 1254 iso-8859-9 | 65001 utf-8 | 1252 iso-8859-1
65001 utf-8 | 1254 iso-8859-9 | 65001 utf-8 | 1254 iso-8859-9
65001 utf-8 | 28591 iso-8859-1 | 65001 utf-8 | 1252 iso-8859-1
65001 utf-8 | 28591 iso-8859-1 | 65001 utf-8 | 1254 iso-8859-9
65001 utf-8 | 28599 iso-8859-9 | 65001 utf-8 | 1252 iso-8859-1
65001 utf-8 | 28599 iso-8859-9 | 65001 utf-8 | 1254 iso-8859-9
65001 utf-8 | 65000 utf-7 | 65001 utf-8 | 1252 iso-8859-1
65001 utf-8 | 65000 utf-7 | 65001 utf-8 | 1254 iso-8859-9
所以,一旦你确信所涉及的确切编码并且你检查它们是可逆的,你可以像这样反转mojibake:
var latin1 = Encoding.GetEncoding(1252, EncoderExceptionFallback.ExceptionFallback, DecoderExceptionFallback.ExceptionFallback);
var utf8 = Encoding.GetEncoding(65001, EncoderExceptionFallback.ExceptionFallback, DecoderExceptionFallback.ExceptionFallback);
utf8.GetString(latin1.GetBytes(utf8.GetString(latin1.GetBytes("Zürich")))).Dump();
C#(LINQPad)
Func<Encoding, String> format = (encoding) => $"{encoding.CodePage} {encoding.BodyName}";
var encodings = Encoding.GetEncodings().Select(e => e.GetEncoding()).ToList();
(
from encoding1 in encodings
from encoding2 in encodings
from encoding3 in encodings
from encoding4 in encodings
where encoding4.GetString(encoding3.GetBytes(encoding2.GetString(encoding1.GetBytes("ü")))) == "ü"
where encoding4.GetString(encoding3.GetBytes(encoding2.GetString(encoding1.GetBytes("ô")))) == "ô"
where encoding4.GetString(encoding3.GetBytes(encoding2.GetString(encoding1.GetBytes("è")))) == "è"
select new { encoding1 = format(encoding1), encoding2 = format(encoding2), encoding3 = format(encoding3), encoding4 = format(encoding4) }
).Dump();
答案 2 :(得分:1)
将这一点分开,让我们看一下问题的症结所在。
195, 188
252
195, 188
)这里的关键是当看到UTF-8(多字节)到Windows-1252(单字节)编码错误时,单个UTF-8字符通常最终会成为两个无意义的字符。看到这里的四个表明双重错误:
就是这样。不知怎的,这是通过两层修改来实现的,但要撤消它,你可以将Windows-1252强制编码为UTF-8,然后假装它是Windows-1252并再次使用UTF-8。