C# UTF8 编码/解码问题

C# UTF8 Encoding/Decoding issue

提问人:adrianjgp 提问时间:4/27/2023 最后编辑:Thomas Dickeyadrianjgp 更新时间:4/30/2023 访问量:232

问:

我必须从远程服务中读取一个错误的编码字符串,并且无法弄清楚如何在 C# 或 Javascript 中恢复正确的值。我既不能更改服务中的值,也不能更改它们在数据库中的保存方式,但我需要正确显示它们。

Bad string: Adrián José
Correct string: Adrián José

该错误可以撤消,因为可以使用 https://www.iosart.com/tools/charset-fixer 等工具或在记事本++ 中通过将编码从 ANSI 更改为 UTF-8 来获得固定值。

到目前为止,我在 JS(客户端)中有这个解决方案,但我不喜欢使用该函数,而是想在服务器端进行修复。escape()

var badString = "Adrián José";
var fixedString = decodeURIComponent(escape(badString)); // "Adrián José"

我尝试在 C# 中使用 Encoding 类(如这里所示),但找不到有效的组合。

var badString = "Adrián José";
var origEnco = Encoding.UTF8;
var targetEnco = Encoding.Default;
byte[] utfBytes = origEnco.GetBytes(badString);
byte[] isoBytes = Encoding.Convert(origEnco, targetEnco, utfBytes);
string fixedString = targetEnco.GetString(isoBytes); // "Adrián José"

我错过了什么?字符集修复器或记事本++如何工作?

JavaScript C# 编码 UTF-8

评论

1赞 Sweeper 4/27/2023
您知道用于生成您得到的字符串的错误编码吗?您知道应该用于解码字符串的正确编码吗?
1赞 ProgrammingLlama 4/27/2023
首先,您是如何获得字符串的?难道这就是问题所在吗?我可以想象的一种情况是:当内容不是 UTF8 编码时使用 HttpClient。.Content.ReadAsStringAsync()
0赞 dbc 4/27/2023
您可能需要遍历所有可能的编码,以弄清楚如何重构字符串。请看一下这个答案的第一部分,以过滤 json 字符串中的无效值作为示例。
0赞 adrianjgp 4/27/2023
谢谢大家的回答。我不知道数据库中字符串的实际编码(在 JSON 中)。在您提供最终解决方案之前,我还尝试了建议的循环。

答:

1赞 ProgrammingLlama 4/27/2023 #1

对于您提供的示例,此代码可以正常工作并按预期输出“Adrián José”:

var currentEncoding = Encoding.GetEncoding("Windows-1252");
var targetEncoding = Encoding.UTF8;
string input = "Adrián José";
string output = targetEncoding.GetString(currentEncoding.GetBytes(input));

如果使用的是 .NET Core/.NET 5+,则需要从 NuGet 安装并将其添加到代码中的某个位置(我通常在 Main 方法的顶部执行此操作):System.Text.Encoding.CodePages

Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);

虽然这提供了您感兴趣的结果,但我不知道它是否适用于您的不良文本的所有实例。

如果可以的话,我会从源头上解决问题,而不是在收到错误编码的字符串后尝试修复它。

评论

0赞 adrianjgp 4/27/2023
谢谢你的帮助!我有点沮丧,因为没有找到一个相对简单的问题的解决方案。在这种情况下,我似乎不需要调用 Convert 函数。