我使用常规的Stream Reader来获取Facebook图形API响应的响应 https://graph.facebook.com/XXXX?access_token=&fields=id,name,about,address,last_name
我正在阅读响应流,但它还给我了 {“id”:“XXXXX”,“name”:“K \ u0131r \ u0131nt \ u0131 Reklam”......}
我的代码如下 - 我未成功尝试使用明确的UTF-8和“iso-8859-9”(土耳其语)编码并设置accept-charset标头。我读过乔尔关于编码的着名文章。看起来每个字符'\''''1''3''1'都是来自facebook的字符 - 我认为这将是UTF-8中值131的2个字节。我很迷惑。我希望这个字符串是“KırıntıReklam”。
我可以简单地找到/替换这些字符串 - 但它远非优雅和可维护。我应该如何正确处理或转换带有重音的字符串的facebook graph api响应?
using (WebResponse response = request.GetResponse())
{
using (Stream dataStream = response.GetResponseStream())
{
if (dataStream != null)
{
using (StreamReader reader = new StreamReader(dataStream))
{
responseFromServer = reader.ReadToEnd();
}
}
}
}
提前谢谢
答案 0 :(得分:0)
tldr; 使用JSON库 - 我喜欢Json.NET - 并且不用担心它。
显示的JSON是有效 JSON, JSON字符串中的\uABCD
表示UTF-16编码字符 1 。内部JSON字符转义格式对于避免必须处理Unicode stream 编码问题非常有用 - 它允许JSON完全以ASCII / 7位清除字符表示(这是UTF-8的一个子集。
使用符合JSON的库来解析具有此类转义的JSON会将JSON恢复为适当的对象图,其中某些值将被正确解码字符串值。该库负责理解JSON并适当地转换/读取它 - 这包括正确处理任何此类\u
转义序列。
流本身( JSON文本)应该使用服务器所说的编码,由BOM表示,或者已经预先协商过:但是真的,这里只是UTF-8。这就是 JSON文本的编码方式,但与JSON字符串中的转义序列无关。
1 每RFC 4627, The application/json Media Type for JavaScript Object Notation (JSON):
任何字符都可能被转义。如果该字符位于Basic中 多语言平面(U + 0000到U + FFFF),然后它可能是 表示为六个字符的序列:反向固相,然后 用小写字母u,后跟四个十六进制数字 编码角色的代码点。十六进制字母A虽然 F可以是大写或小写。所以,例如,一个包含的字符串 只有一个反向固相字符可以表示为
"\u005C"
。或者,有两个字符的序列转义 一些流行角色的表现形式。所以,例如,a 只包含一个反向固相字符的字符串可能是 更紧凑地表示为
"\\"
。转义不在Basic Multilingual中的扩展字符 平面,角色表示为十二个字符的序列, 编码UTF-16代理对。所以,例如,一个字符串 只包含G谱号字符(U + 1D11E)可以表示为
"\uD834\uDD1E"