处理包含“问号”(?)的字符串时的编码问题

Osc*_*car 2 c# encoding utf-8 iso-8859-1 character-encoding

我正在解析来自HttpWebRequest.

此 Web 内容使用字符集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);
Run Code Online (Sandbox Code Playgroud)

但是utfWord变量输出ESPA?OL里面还是错误的。正确的输出应该是ESPAÑOL.

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

Dav*_*nan 5

有问题的词是“ESPAÑOL”。这可以在 ISO-8859-1 中正确编码,因为单词中的所有字符都以 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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这告诉您的是,您需要正确诊断错误字符的来源。到时候你有一个 ? 性格,为时已晚。信息已经丢失。的存在?字符表示在某个时刻执行了转换为不包含字符 Ñ 的字符集。

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

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