总之,我检索一个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。感谢您的回复!
答案 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验证程序(例如JSONLint或JSON Format)对其进行测试:
{
"unescaped": "ñ",
"escaped": "\u00f1",
"wrong": "\u00c3\u00b1"
}
答案 2 :(得分:0)
如果将此字符串传递给JSON解析器会发生什么?
string s = "\\u00c3\\u00b1";
我怀疑你会得到"ñ"
。
有没有办法告诉你的JSON解析器解释字符串中的字符,好像它们是UTF-8字节一样?
您最好从响应流中读取原始字节并将其传递给JSON解析器。
我认为问题在于您将原始字节转换为包含编码字符的字符串。 JSON解析器不知道您是否希望将“\ u00c3 \ u00b1”转换为单个UTF-8字符或两个字符。