首页 > 解决方案 > 使用 Faraday 解析 UTF-8

问题描述

我正在使用 Ruby 中的 Faraday 发出 API 请求,并使用JSON.parse. 问题是,JSON 响应中包含诸如Longitud de la estaci\u00F3n meteorol\u00F3gica (grados)but it should be 之类的句子Longitud de la estación meteorológica (grados)

有没有办法正确解析这个?我有connection = Faraday.new(my_site),如果我这样做了connection.get.body.encoding,我就会得到#<Encoding:ASCII-8BIT>,但是当我尝试时connection.get.body.force_encoding('ASCII-8BIT).force_encoding('UTF-8)connection.get.body.force_encoding('ASCII-8BIT).encode('UTF-8)我就会得到'encode': "\xF3" from ASCII-8BIT to UTF-8 (Encoding::UndefinedConversionError)

提前非常感谢!

标签: rubycharacter-encodingfaraday

解决方案


尝试这个:

connection.get.body.force_encoding('ISO-8859-1').encode('UTF-8')

我不知道法拉第,但从Encoding::UndefinedConversionError错误来看,可能就是这样。我假设connection.get.body返回一个普通的 String 实例或其等价物。

背景

正如官方文档(Ver.2.5.1)所述,您不应尝试转换ASCII-8BIT为任何其他编码:

Encoding::ASCII_8BIT 是一种特殊的编码,通常用于字节串,而不是字符串。

所谓的扩展 ASCII,其中包含一些字母标点符号,通常是 ISO-8859-1,尽管存在其他编码方法。当然,在 ISO-8859-1 中owith的代码点'是 \xF3。这是一个演示它的代码片段:

"\xf3".force_encoding('ISO-8859-1').encode('UTF-8')
  # => "ó"
"\xf3".force_encoding('ASCII-8BIT').encode('UTF-8')
  # => Encoding::UndefinedConversionError 

这个过去的答案更详细地解释了它。


推荐阅读