【问题标题】:C# To transform Facebook Response to proper encoded stringC# 将 Facebook 响应转换为正确的编码字符串
【发布时间】:2014-02-01 07:35:13
【问题描述】:

我正在使用常规 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”(土耳其语)编码并设置接受字符集标头,但未成功。我阅读了 Joel 关于编码的著名文章。看起来每个字符 '\' 'u' '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();
        }

    }
}
}

提前谢谢你

【问题讨论】:

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


【解决方案1】:

tldr; 使用 JSON 库 - 我喜欢 Json.NET - 不要担心。

显示的 JSON 有效JSON,其中 JSON 字符串中的 \uABCD 表示 UTF-16 编码字符1。内部 JSON 字符转义格式对于 避免 必须处理 Unicode 编码问题很有用 - 它允许 JSON 完全用 ASCII/7 位纯字符表示(它是 UTF-8 的子集)。

使用符合标准的 JSON 库来解析带有此类转义的 JSON 会将 JSON 还原为适当的对象图,其中一些值将被正确解码字符串值。该库负责理解 JSON 并酌情转换/读取它 - 这包括正确处理任何此类 \u 转义序列。

stream 本身(JSON 文本 的)应该使用服务器所说的编码,由 BOM 指示,或者已经预先协商:但是真的,这里只有 UTF-8。这就是 JSON 文本 的编码方式,但与 JSON 字符串中的转义序列无关。


1RFC 4627, The application/json Media Type for JavaScript Object Notation (JSON)

任何字符都可以转义。如果该字符在 Basic 多语言平面(U+0000 到 U+FFFF),那么它可能是 表示为六个字符的序列:反向固线,后跟 由小写字母 u 后跟四个十六进制数字 对字符的代码点进行编码。十六进制字母 A 虽然 F 可以是大写或小写。因此,例如,一个字符串包含 只有一个反斜线字符可以表示为 "\u005C".

或者,有两个字符的序列转义 一些流行角色的表示。因此,例如,一个 仅包含一个反向斜线字符的字符串可能是 更紧凑地表示为"\\"

转义不在基本多语言中的扩展字符 平面,字符表示为十二个字符的序列, 编码 UTF-16 代理对。因此,例如,一个字符串 仅包含 G 谱号字符 (U+1D11E) 可以表示为 "\uD834\uDD1E"


对于怀疑者,这里有一个 LINQPad 示例。这使用 JSON.Net 并导入 Newtonsoft.Json.Linq 命名空间。

var json = @"{""name"":""K\u0131r\u0131nt\u0131 Reklam""}";
json.Dump();                        // -> {"name":"K\u0131r\u0131nt\u0131 Reklam"}
var name = JObject.Parse(json)["name"].ToString();
(name == "Kırıntı Reklam").Dump();  // -> true

【讨论】:

  • facebook 编码完全错误,大家都在抱怨,Json.Net 库没有修复任何东西。
  • @Zyo 人们抱怨有效的事情,即使不是预期的,也不会使有效的事情“完全错误”。我已经更新了可以在 LINQPad 中运行的演示 sn-p 的答案。 JSON.Net 理解/接受此类有效且定义明确的 JSON,从而正确反序列化该值。确保对 JSON 数据使用支持 JSON 的库/工具。
猜你喜欢
  • 1970-01-01
  • 2019-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多