为什么 ruby http 库会导致意外的字符编码? (遏制、Excon 与 shell-out)

问题描述 投票:0回答:1

我从外部请求库(curb、excon)获取 ascii-8bit 的响应主体,我期望 utf-8。

我的 ruby 环境默认设置为 utf-8 编码:

Encoding.default_external
=> #<Encoding:UTF-8>
Encoding.default_internal
=> #<Encoding:UTF-8>

我无法透露此请求中的 url 或(显然)身份验证令牌,但如果我使用

curl
:

,我会得到有效的 utf-8 响应
text = `curl -H "Authorization: Bearer #{token}" "#{url}"`
text[28782..28786]
=> "Maté,"
text.encoding
=> #<Encoding:UTF-8>

但是如果我使用任何 ruby 库,我会得到不同的结果

路边:

curl = Curl::Easy.new(url)
curl.headers["Authorization"] = "Bearer #{client.auth_token}"
curl.http_get
body = curl.body_str
body[28782..28786]
=> "Mat\xC3\xA9"
body.encoding
=> #<Encoding:ASCII-8BIT>

excon:

connection = Excon.new(url, headers: {"Authorization" => "Bearer #{token}"})
response = connection.get
response_body = response.body
response_body[28782..28786]
=> "Mat\xC3\xA9"
response_body.encoding
=> #<Encoding:ASCII-8BIT>

将响应数据保存到其他外部服务时,这会导致问题。我知道在这种情况下,我可以简单地在通话结束时打上

force_encoding("utf-8")
,但这看起来就像是创可贴。所以我的问题是:这些 http 库的响应如何被解释为 ascii-8bit,以及如何系统地更改它?

ruby character-encoding curb excon
1个回答
0
投票

很抱歉听到您遇到问题。我是 excon 的主要开发者和维护者,所以我至少可以回答你问题的这一部分。

HTTP/1.1 在许多情况下都是以字节计数为导向的,因此使用 ascii 是实现这一点的简单方法,而无需担心多字节字符等。

话虽这么说,如果您确信响应是 UTF-8(一个很好的迹象是内容类型标头这么说),我认为强制其采用“UTF-8”编码应该是安全/合理的。我怀疑这就是我在这种情况下会做的事情,或者至少值得一试。

您对此是否有特别的担忧,让您觉得这只是一个创可贴,或者不是一个合理的长期解决方案?

© www.soinside.com 2019 - 2024. All rights reserved.