目标:
从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);

最佳答案

"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

09-25 16:45