.NET 3.5 C#StreamReader错误地读取ISO-8859-1字符

时间:2011-12-13 06:24:40

标签: c# .net character-encoding streamreader latin

总之,我检索一个HTTP Web响应,其中包含带有unicode字符的JSON格式数据,例如“\ 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 \ u00b1o”。

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。感谢您的回复!

3 个答案:

答案 0 :(得分:1)

替换

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

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

答案 1 :(得分:1)

您收到的JSON回复无效。 "\u00c3\u00b1"不是ñ的正确编码。

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

由于JSON响应无论如何都是UTF-8,因此无需转义ñ的两个字节序列。如果使用转义,则不能将其应用于两个字节序列,而是应用于单个Unicode字符本身。然后会产生"\u00f1"

您可以通过粘贴以下JSON数据,使用在线JSON验证程序(例如JSONLintJSON Format)对其进行测试:

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

答案 2 :(得分:0)

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

string s = "\\u00c3\\u00b1";

我怀疑你会得到"ñ"

有没有办法告诉你的JSON解析器解释字符串中的字符,好像它们是UTF-8字节一样?

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

我认为问题在于您将原始字节转换为包含编码字符的字符串。 JSON解析器不知道您是否希望将“\ u00c3 \ u00b1”转换为单个UTF-8字符或两个字符。