c# StreamReader读取ISO-8859-1字符错误

本文关键字:字符 错误 ISO-8859-1 读取 StreamReader | 更新日期: 2023-09-27 18:17:53

总之,我检索一个包含JSON格式数据的HTTP Web响应,其中包含unicode字符,如"'u00c3'u00b1",应翻译为"ñ"。相反,我使用的JSON解析器将这些字符转换为"ñ"。我正在寻找的行为是将这些字符翻译为"ñ"。

取以下代码并执行…

string nWithAccent = "'u00c3'u00b1";
Encoding iso = Encoding.GetEncoding("iso8859-1");
byte[] isoBytes = iso.GetBytes(nWithAccent);
nWithAccent = Encoding.UTF8.GetString(isoBytes);

nWithAccent输出"ñ"。这就是我想要的结果。我把上面的代码,并使用它下面的"response_body"变量包含相同的字符如上(从我可以看到使用Visual Studio 2008文本分析器),并没有得到相同的结果…它对字符"'u00c3'u00b1"不做任何操作。

在我的应用程序中,我对一个以JSON格式检索数据的外部系统执行以下代码。在使用Visual Studio中的文本分析器检查"response_body"变量时,我看到的是"'u00c3'u00b1"而不是ñ。例如,单词"niño"将在文本分析器中显示为"ni'u00c3' u00b10"。

using (HttpWResponse = (HttpWebResponse)this.HttpWRequest.GetResponse())
{
    using (StreamReader reader = new StreamReader(HttpWResponse.GetResponseStream(), Encoding.UTF8))
    {
        // token will expire 60 min from now.
        this.TimeTillTokenExpiration = DateTime.Now.AddMinutes(60);
        // read response data
        response_body = reader.ReadToEnd();
    }
}    

然后,我使用开源JSON解析器将"'u00c3"替换为"Ã","'u00b1"替换为"±",最终结果为"ñ"而不是"ñ"。是JSON解析器有问题,还是我对响应流应用了错误的编码?响应中的报头表明字符集为UTF-8。谢谢你的回复!

c# StreamReader读取ISO-8859-1字符错误

您正在接收的JSON响应无效。"'u00c3'u00b1"不是ñ的正确编码。

相反,它是一种双重编码。它首先被编码为UTF-8字节序列,然后128以上的字节用'u序列进行转义。

由于JSON响应通常是UTF-8,因此不需要转义ñ的两个字节序列。如果使用转义,则不能将其应用于两个字节序列,而是应用于单个Unicode字符本身。这将导致"'u00f1"

你可以用一个在线JSON验证器(如JSONLint或JSON格式)通过粘贴以下JSON数据来测试它:

{
    "unescaped": "ñ",
    "escaped": "'u00f1",
    "wrong": "'u00c3'u00b1"
}

Replace

new StreamReader(HttpWResponse.GetResponseStream(), Encoding.UTF8))

new StreamReader(HttpWResponse.GetResponseStream(), Encoding.GetEncoding("iso8859-1")))

如果将这个字符串传递给JSON解析器会发生什么?

string s = "''u00c3''u00b1";

我猜你会得到"ñ"

是否有一种方法可以告诉你的JSON解析器解释字符串中的字符,虽然它们是UTF-8字节?

你可能最好从响应流中读取原始字节,并将其传递给JSON解析器。

我认为问题是你将原始字节转换为包含编码字符的字符串。JSON解析器不知道您是想将"'u00c3'u00b1"转换为单个UTF-8字符,还是两个字符。