【问题标题】:How to fix encoding problems with only some chars in a string?如何解决字符串中只有一些字符的编码问题?
【发布时间】:2019-05-25 18:17:45
【问题描述】:

我在处理来自 JSON 的 UTF-8 字符串时遇到了一些麻烦。当我执行 POST 请求以在 API 中检索 UTF-8 JSON 时,某些字符无法编码并被损坏。

我在请求中将字符集正确设置为 UTF-8,并且大多数重音字符都已正确转换,但不知何故,“ã”无法在我的字符串的某个点中进行编码。

例子:

我有字符串 "entendeu que a pretensão de complementação de ações buscada pelos adquirentes de linhas telefônicas deve ter como referência o valor patrimonial da aç��o apurado com基础没有平衡"

在上面的示例中,在“complementação”这个词中,有问题的字符被正确转换,但在“aç��o”中我有编码问题。

有人可以帮助我吗?你已经看过了吗?

谢谢!

编辑: 我使用 Fiddler 4 来嗅探我的请求,当我从检查员那里获得文本时它很好,但在 VisualStudio 2017 中,字符串仅在该点被损坏。

编辑 2: 我使用了 Fiddler 的 HexView,发现每个“ã”都带有代码 0xC3A3,正确的和损坏的。我认为我用来执行 Web 请求的库有问题。我将测试一些其他库,以查看问题是否仍然存在。谢谢大家的帮助!

编辑 3 找到这个链接:http://www.fileformat.info/info/unicode/char/e3/index.htm 它有助于任何人理解我的问题吗?

编辑 4 搜索更多关于我收到的十六进制代码并发现:https://www.fileformat.info/info/unicode/char/c3a3/index.htm。我认为当代码尝试将 C3A3 从 UTF-8 转换为 UTF-16(VisualStudio 中 C# 的字符串编码)时,就会出现问题,但我不知道如何正确进行这种转换。我会继续挖掘,如果我发现任何其他内容,我会在这里更新。

【问题讨论】:

标签: c# encoding


【解决方案1】:

我尝试将字符串编码为不同的编码并返回为 UTF-8,但我没有设法得到相同的解码错误。

这让我认为原始字符串有问题,因为它正确地解码了“complementação”这个词,难道“aç��o”这个词有多么错误或拼写错误?

编辑添加了一些测试

我尝试将所有这些编码转换为 UTF-8,但没有一个转换正确,但没有其他:

var str = "entendeu que a pretensão de complementação de ações" + 
" buscada pelos adquirentes de linhas telefônicas deve ter como" +
" referência o valor patrimonial da ação apurado com base no balancete";

WriteAsUtf8(str, Encoding.UTF8);
WriteAsUtf8(str, Encoding.UTF7);
WriteAsUtf8(str, Encoding.ASCII);
WriteAsUtf8(str, Encoding.GetEncoding("ISO-8859-1"));
WriteAsUtf8(str, Encoding.GetEncoding("ISO-8859-2"));
WriteAsUtf8(str, Encoding.GetEncoding("ISO-8859-3"));
WriteAsUtf8(str, Encoding.GetEncoding("ISO-8859-4"));
WriteAsUtf8(str, Encoding.GetEncoding("ISO-8859-5"));
WriteAsUtf8(str, Encoding.GetEncoding("ISO-8859-6"));
WriteAsUtf8(str, Encoding.GetEncoding("ISO-8859-7"));
WriteAsUtf8(str, Encoding.GetEncoding("ISO-8859-8"));
WriteAsUtf8(str, Encoding.GetEncoding("ISO-8859-9"));
WriteAsUtf8(str, Encoding.GetEncoding("ISO-8859-13"));
WriteAsUtf8(str, Encoding.GetEncoding("ISO-8859-15"));
WriteAsUtf8(str, Encoding.GetEncoding("windows-1250"));
WriteAsUtf8(str, Encoding.GetEncoding("windows-1251"));
WriteAsUtf8(str, Encoding.GetEncoding("windows-1252"));
WriteAsUtf8(str, Encoding.GetEncoding("windows-1253"));
WriteAsUtf8(str, Encoding.GetEncoding("windows-1254"));
WriteAsUtf8(str, Encoding.GetEncoding("windows-1255"));
WriteAsUtf8(str, Encoding.GetEncoding("windows-1256"));
WriteAsUtf8(str, Encoding.GetEncoding("windows-1257"));
WriteAsUtf8(str, Encoding.GetEncoding("windows-1258"));

void WriteAsUtf8(string text, Encoding encoding)
{
    var bytes = encoding.GetBytes(text);
    var name = encoding.EncodingName;
    var description = $"{name}:{new string(' ', 35 - name.Length)}";
    Console.WriteLine($"{description}{Encoding.UTF8.GetString(bytes)}");
}

这是结果:

Unicode (UTF-8):               entendeu que a pretensão de complementação de ações buscada pelos adquirentes de linhas telefônicas deve ter como referência o valor patrimonial da ação apurado com base no balancete
Unicode (UTF-7):               entendeu que a pretens+AOM-o de complementa+AOcA4w-o de a+AOcA9Q-es buscada pelos adquirentes de linhas telef+APQ-nicas deve ter como refer+AOo-ncia o valor patrimonial da a+AOcA4w-o apurado com base no balancete
US-ASCII:                      entendeu que a pretens?o de complementa??o de a??es buscada pelos adquirentes de linhas telef?nicas deve ter como refer?ncia o valor patrimonial da a??o apurado com base no balancete
Western European (ISO):        entendeu que a pretens�o de complementa��o de a��es buscada pelos adquirentes de linhas telef�nicas deve ter como refer�ncia o valor patrimonial da a��o apurado com base no balancete
Central European (ISO):        entendeu que a pretensao de complementa�ao de a�oes buscada pelos adquirentes de linhas telef�nicas deve ter como referencia o valor patrimonial da a�ao apurado com base no balancete
Latin 3 (ISO):                 entendeu que a pretensao de complementa�ao de a�oes buscada pelos adquirentes de linhas telef�nicas deve ter como refer�ncia o valor patrimonial da a�ao apurado com base no balancete
Baltic (ISO):                  entendeu que a pretens�o de complementac�o de ac�es buscada pelos adquirentes de linhas telef�nicas deve ter como referencia o valor patrimonial da ac�o apurado com base no balancete
Cyrillic (ISO):                entendeu que a pretensao de complementacao de acoes buscada pelos adquirentes de linhas telefonicas deve ter como referencia o valor patrimonial da acao apurado com base no balancete
Arabic (ISO):                  entendeu que a pretensao de complementacao de acoes buscada pelos adquirentes de linhas telefonicas deve ter como referencia o valor patrimonial da acao apurado com base no balancete
Greek (ISO):                   entendeu que a pretensao de complementacao de acoes buscada pelos adquirentes de linhas telefonicas deve ter como referencia o valor patrimonial da acao apurado com base no balancete
Hebrew (ISO-Visual):           entendeu que a pretensao de complementacao de acoes buscada pelos adquirentes de linhas telefonicas deve ter como referencia o valor patrimonial da acao apurado com base no balancete
Turkish (ISO):                 entendeu que a pretens�o de complementa��o de a��es buscada pelos adquirentes de linhas telef�nicas deve ter como refer�ncia o valor patrimonial da a��o apurado com base no balancete
Estonian (ISO):                entendeu que a pretensao de complementacao de ac�es buscada pelos adquirentes de linhas telefonicas deve ter como referencia o valor patrimonial da acao apurado com base no balancete
Latin 9 (ISO):                 entendeu que a pretens�o de complementa��o de a��es buscada pelos adquirentes de linhas telef�nicas deve ter como refer�ncia o valor patrimonial da a��o apurado com base no balancete
Central European (Windows):    entendeu que a pretensao de complementa�ao de a�oes buscada pelos adquirentes de linhas telef�nicas deve ter como referencia o valor patrimonial da a�ao apurado com base no balancete
Cyrillic (Windows):            entendeu que a pretensao de complementacao de acoes buscada pelos adquirentes de linhas telefonicas deve ter como referencia o valor patrimonial da acao apurado com base no balancete
Western European (Windows):    entendeu que a pretens�o de complementa��o de a��es buscada pelos adquirentes de linhas telef�nicas deve ter como refer�ncia o valor patrimonial da a��o apurado com base no balancete
Greek (Windows):               entendeu que a pretensao de complementacao de acoes buscada pelos adquirentes de linhas telefonicas deve ter como referencia o valor patrimonial da acao apurado com base no balancete
Turkish (Windows):             entendeu que a pretens�o de complementa��o de a��es buscada pelos adquirentes de linhas telef�nicas deve ter como refer�ncia o valor patrimonial da a��o apurado com base no balancete
Hebrew (Windows):              entendeu que a pretens?o de complementa??o de a??es buscada pelos adquirentes de linhas telef?nicas deve ter como refer?ncia o valor patrimonial da a??o apurado com base no balancete
Arabic (Windows):              entendeu que a pretens?o de complementa�?o de a�?es buscada pelos adquirentes de linhas telef�nicas deve ter como refer�ncia o valor patrimonial da a�?o apurado com base no balancete
Baltic (Windows):              entendeu que a pretens?o de complementa??o de a?�es buscada pelos adquirentes de linhas telef?nicas deve ter como refer?ncia o valor patrimonial da a??o apurado com base no balancete
Vietnamese (Windows):          entendeu que a pretens?o de complementa�?o de a�?es buscada pelos adquirentes de linhas telef�nicas deve ter como refer�ncia o valor patrimonial da a�?o apurado com base no balancete

【讨论】:

  • 感谢您的回复!我使用 Fiddler 嗅探请求,在 Fiddler 中它看起来不错,文本和 HexView (所有“ã”都是 0xC3A3,正确的和损坏的)。我开始认为我用来执行 WebRequest 的库有问题。我将测试其他一些以检查问题是否仍然存在。
  • 不客气,抱歉没用,希望您能找到解决办法。
猜你喜欢
  • 1970-01-01
  • 2021-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多