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。谢谢你的回复!
您正在接收的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字符,还是两个字符。