C#将Facebook Response转换为正确的编码字符串

时间:2014-02-01 07:35:13

标签: facebook facebook-graph-api encoding utf-8

我使用常规的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();
        }

    }
}
}

提前谢谢

1 个答案:

答案 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"