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