【问题标题】:Encoding issue when handling a string that contains "question mark" (�)处理包含“问号”(�) 的字符串时的编码问题
【发布时间】:2014-04-22 11:14:53
【问题描述】:

我正在解析来自HttpWebRequest 的响应中的一些网络内容。

此网页内容使用字符集ISO-8859-1,在解析它并最终从响应中获得所需的单词时,我收到一个带有问号的string,像 这样的问号,我想知道哪个是将其转换回可读的string 的正确方法。

所以,我尝试将当前单词encoding 转换为UTF-8,如下所示:

(我想知道UTF-8是否可以解决我的问题)

string word = "ESPA�OL";

Encoding iso = Encoding.GetEncoding("ISO-8859-1");
Encoding utf = Encoding.GetEncoding("UTF-8");

byte[] isoBytes = iso.GetBytes(word);
byte[] utfBytes = Encoding.Convert(iso, utf, isoBytes);

string utfWord = utf.GetString(utfBytes);

Console.WriteLine(utfWord);

但是,utfWord 变量输出 ESPA?OL 仍然是错误的。正确的输出应该是ESPAÑOL

如果可能的话,谁能给我正确的方向来解决这个问题?

【问题讨论】:

  • � 是替换字符,编码器使用它来指示他们无法识别文本流中的 byte(s)。例如在使用 8859-1 代码页编码的文本上错误地使用 Encoding.UTF8。之后您无法修复它,您已经丢失了原始字节值。它必须在源头固定。
  • @HansPassant 是的,我对此有所了解,但完全不清楚。感谢您的解释,我希望对 � 做点什么,但现在我知道这是不可能的(我也无权访问远程网站源),所以他们似乎遇到了编码问题。

标签: c# encoding utf-8 character-encoding iso-8859-1


【解决方案1】:

有问题的词是“ESPAÑOL”。这可以在 ISO-8859-1 中正确编码,因为单词中的所有字符都是represented in ISO-8859-1

您可以使用以下简单程序亲自查看:

using System;
using System.Diagnostics;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Encoding enc = Encoding.GetEncoding("ISO-8859-1");
            string original = "ESPAÑOL";
            byte[] iso_8859_1 = enc.GetBytes(original);
            string roundTripped = enc.GetString(iso_8859_1);
            Debug.Assert(original == roundTripped);
            Console.WriteLine(roundTripped);
        }
    }
}

这告诉您,您需要正确诊断错误字符的来源。当你有一个�字符时,为时已晚。信息已丢失。 � 字符的存在表明,在某些时候,执行了转换为不包含字符 Ñ 的字符集。

从 ISO-8859-1 到 Unicode 编码的转换将正确处理“ESPAÑOL”,因为该词可以用 ISO-8859-1 编码。

最可能的解释是,在此过程中,文本“ESPAÑOL”被转换为不包含字母 Ñ 的字符集。

【讨论】:

  • 感谢解释,终于明白了。但是,我无法访问源代码(来自远程网站),所以他们显然有编码问题。
  • 我的原始字符串是“Møhan”,它显示为“Møhan”,但使用您的代码转换后它变成“M?han” - 我如何获得原始的“Møhan”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-04-04
  • 1970-01-01
  • 1970-01-01
  • 2021-12-02
  • 1970-01-01
  • 1970-01-01
  • 2021-01-09
相关资源
最近更新 更多