【发布时间】:2017-08-24 17:57:51
【问题描述】:
我从无法控制的 API 接收到一些文本。当我收到表情符号时,它们没有为 Ruby 正确编码。这是我收到的一个示例:
- 编码:“\u1F44C”
- 解码:“ὄC”
Ruby 不处理超过 4 个十六进制字符的 unicode,除非您使用花括号。所以“\u{1F44C}”会被正确解码为????。
如何将 API 的输出转换为 Ruby 可以正确解码的格式?
【问题讨论】:
-
在 Ruby 接触它之前,实际的 API 响应是什么样的(例如来自 curl)?它的编码是什么?你得到例如在 UTF-8 中表示
????的四个字节(0xF0 0x9F 0x91 0x8C),或者你得到的是文字字符\,u,1,...(这将是 7 个字节)? -
@Jordan 我刚刚在浏览器中发出了一个 API 请求并收到了这个 JSON 有效负载:
{ "text": "OK\u1F44C let me see." }响应标头是:Content-Type:application/json; charset=UTF-8 -
那么在响应中
\u1F44C是\、u、1等7 个字节? -
@Jordan
\u1F44C是我正在查看的 7 个字节。 -
您在这里处理的是一个损坏的 API。这不是 Ruby 问题,而是 JSON 编码器问题。根据the JSON spec,“要转义不在基本多语言平面中的扩展字符 [即 U+0000 到 U+FFFF],该字符表示为 12 个字符序列,编码 UTF-16 代理对。”
????的正确编码是\uD83D\uDC4C。任何兼容的 JSON 解析器都会产生与您看到的相同的输出。您应该向 API 供应商报告错误。