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