javascript C# UTF8编码/解码问题

enyaitl3  于 2023-04-28  发布在  Java
关注(0)|答案(1)|浏览(160)

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

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#中的Encoding类(like here),但找不到有效的组合。

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++是如何工作的?

zi8p0yeb

zi8p0yeb1#

对于您提供的示例,此代码可以正常工作并按预期输出“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);

虽然这提供了您感兴趣的结果,但我不知道它是否适用于所有错误文本。
如果可以的话,我会在源代码处修复这个问题,而不是在你有了错误编码的字符串之后试图修复它。

相关问题