德国字符编码

时间:2018-03-12 17:12:04

标签: character-encoding

我有一个包含联系人的大型CSV文件,所有非拉丁字符都显示如下:

ZüÂrich(苏黎世)

GrÃÂ'ne(Grône)

Chesières(Chesières)

Genève(日内瓦)

我尝试用正确的字符替换它们,例如:

str_replace('ü', 'ü', $string);

它们没有改变,我试图将它们插入MySQL数据库然后替换它们,它们仍然是相同的。

我该怎么办?

3 个答案:

答案 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)

将这一点分开,让我们看一下问题的症结所在。

  • üinUTF-8:195, 188
  • ü在Windows-1252252
  • ü以UTF-8误解为Windows-1252:Ã(195, 188

这里的关键是当看到UTF-8(多字节)到Windows-1252(单字节)编码错误时,单个UTF-8字符通常最终会成为两个无意义的字符。看到这里的四个表明双重错误:

  • ü以UTF-8误解为Windows-1252:Ã
  • UTF-8中的
  • ¼被误解为Windows-1252:ü

就是这样。不知怎的,这是通过两层修改来实现的,但要撤消它,你可以将Windows-1252强制编码为UTF-8,然后假装它是Windows-1252并再次使用UTF-8。

相关问题