如何从utf 8解码为Clean Text

时间:2017-12-14 14:11:48

标签: c# utf-8 decode

目标:
从utf 8解码为干净文本

问题:
根据以下代码,它不想从“masaväg”解码为“masaväg”。

我错过了哪一部分?

谢谢!

的信息:
它可以在此页面中从“masaväg”解码为“masaväg” https://www.browserling.com/tools/utf8-decode

    UTF8Encoding utf8 = new UTF8Encoding();
    String unicodeString = "masaväg";
    // Encode the string.
    Byte[] encodedBytes = utf8.GetBytes(unicodeString);
    // Decode bytes back to string.
    String decodedString = utf8.GetString(encodedBytes);

1 个答案:

答案 0 :(得分:4)

"masaväg"的正确utf8是十六进制6d 61 73 61 76 c3 a4 67

看起来你用错误的编码解码了这个;我们可以弄清楚可能是这样的:

var bytes = Encoding.UTF8.GetBytes("masaväg");
foreach(var enc in Encoding.GetEncodings())
{
    try
    {
        if(enc.GetEncoding().GetString(bytes) == "masaväg")
        {
            Console.WriteLine($"{enc.CodePage} {enc.DisplayName}");
        }
    } catch { }
}

输出:

1252 Western European (Windows)
1254 Turkish (Windows)
28591 Western European (ISO)
28594 Baltic (ISO)
28599 Turkish (ISO)
65000 Unicode (UTF-7)

现在:我不知道你使用了哪一个,但我们假设它是1252。

所以要扭转这种混乱(注意这是不可靠,如果你只将它作为这个乱码文本数据而不是底层编码字节,你的数据可能已经被破坏了):

var enc = Encoding.GetEncoding(1252);
var bytes = enc.GetBytes("masaväg");
var viaUtf8 = Encoding.UTF8.GetString(bytes);
Console.WriteLine(viaUtf8);

输出:

masaväg

注意这里重要的不是“masaväg”是“utf8”或“masaväg”是“干净的文字”;相反:如果使用错误的编码将字节解码为文本,则会获得“masaväg”。在这种情况下,解码时使用的正确编码是utf8。只有二​​进制数据“是utf8”。一旦它是文本(.NET术语中的string):它就是代码点。并且“编码”(例如utf8)定义了代码点如何映射到字节(这实际上是“编码”)。

注意:代码页1252 经常 Encoding.Default是什么,因此为什么1252是一个安全的假设。坦率地说,你永远不应该使用Encoding.Default 来做任何事情。您应始终知道您打算使用的编码。我建议我们提交PR以将Encoding.Default重命名为Encoding.PotLuck