c# - 如何从 utf 8 解码为干净的文本

标签 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);

最佳答案

"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

关于c# - 如何从 utf 8 解码为干净的文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47815398/

相关文章:

c# - 如何检查 IOException 是否为 Not-Enough-Disk-Space-Exception 类型?

c# - 从 .net 应用程序访问 MS-Exchange 全局访问列表的最佳方式

Delphi xe2 编码/解码 Base 64

Python3 - Chrome 奇怪的 urldecode 与 urllib.parse.parse_qs()

c# - 通过C#自动排列visio形状

c# - 'Microsoft.WindowsAzure.ServiceRuntime.RoleEnvironment' 的类型初始值设定项抛出异常

.net - Outlook 自动清理我的换行符并搞乱我的电子邮件格式

java - 为什么阿拉伯字母没有插入数据库?

java - 从表单编码传递的土耳其语字符在浏览器上有所不同

java - Base64编码-解码(Java中)支持数学符号吗?