c# - 处理包含 "question mark"(�) 的字符串时出现编码问题

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

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

此 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);

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

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

最佳答案

有问题的词是“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”被转换为不包含字母 Ñ 的字符集。

关于c# - 处理包含 "question mark"(�) 的字符串时出现编码问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22451154/

相关文章:

c# - 对主窗体使用 Owner.Show() 时,应用程序保持打开状态

c# - 套接字缓冲它接收到的数据

java - 依赖默认编码,我应该使用什么以及为什么?

unicode - 什么可以解释这种糟糕的字符编码?

java - 用于编码的不可映射字符

api - 状态更新中不允许使用星号 (*)

c# - 在网络聊天中测试无法使用应用程序服务

C#4.0 使用 winmm.dll 以超过 192kbps 的速度播放 .mp3 文件时出现问题

Python脚本将 latex 字符串解析/转换为utf-8?

c# - TextWriter 序列化为 UTF-8 字符串