我必须从远程服务读取一个错误的编码字符串,并且无法弄清楚如何在 C# 或 Javascript 中恢复正确的值。我既不能更改服务中的值,也不能更改它们在数据库中的保存方式,但我需要正确显示它们。
Bad string: Adrián José
Correct string: Adrián José
可以撤消错误,因为可以使用诸如 https://www.iosart.com/tools/charset-fixer 之类的工具或在 Notepad++ 中通过将编码从 ANSI 更改为 UTF-8 来获得固定值。
到目前为止,我在 JS(客户端)中有这个解决方案,但我不喜欢使用
escape()
功能,并且想在服务器端进行修复。
var badString = "Adrián José";
var fixedString = decodeURIComponent(escape(badString)); // "Adrián José"
我尝试使用 C# 中的编码类(像这里),但找不到有效的组合。
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é"
我错过了什么?字符集修复器或 Notepad++ 是如何工作的?
对于您提供的示例,此代码可以正常工作并按预期输出“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 安装
System.Text.Encoding.CodePages
并将其添加到代码中的某处(我通常在 Main 方法的顶部执行):
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
虽然这提供了您感兴趣的结果,但我不知道它是否适用于所有错误文本实例。