"{\"timezo-6ren">
gpt4 book ai didi

ruby - 为 Net::HTTP 指定字符编码

转载 作者:行者123 更新时间:2023-12-05 00:50:15 25 4
gpt4 key购买 nike

当我发出这个 HTTP 请求时:

Net::HTTP.get_response('www.telize.com',"/geoip/190.88.39.27").body
=> "{\"timezone\":\"America\\/Curacao\",\"isp\":\"United Telecommunication Services (UTS)\",\"country\":\"Cura\xE7ao\",\"dma_code\":\"0\",\"region_code\":\"00\",\"area_code\":\"0\",\"ip\":\"190.88.39.27\",\"asn\":\"AS11081\",\"continent_code\":\"NA\",\"city\":\"Willemstad\",\"longitude\":-68.9167,\"latitude\":12.1,\"country_code\":\"CW\",\"country_code3\":\"CUW\"}\n"

它返回一个 JSON 正文,但请注意国家:\"country\":\"Cura\xE7ao\"。响应体实际上应该是这样的:“country”:“Curaçao”。看起来 Net::HTTP 假设这是 ASCII-8BIT:

Net::HTTP.get_response('www.telize.com',"/geoip/190.88.39.27").body.encoding
=> Encoding:ASCII-8BIT

但事实并非如此。发出请求时如何告诉 Net::HTTP 使用哪种字符编码?

最佳答案

正如铁皮人所确定的,“\xE7”是 LATIN SMALL LETTER C WITH CEDILLA 的 latin-1 编码,据我所知,这不是有效的 json 编码。

但是......一旦你知道编码,你可以将它从 ruby​​ 的 ASCII-8BIT(这只是意味着 ruby​​ 认为数据是二进制的,即未编码的)更改为 UTF-8,如下所示:

require 'net/http'

server_encoding = "ISO-8859-1"
resp = Net::HTTP.get_response('www.telize.com',"/geoip/190.88.39.27")
json = resp.body.force_encoding(server_encoding).encode("UTF-8")
puts json

--output:--

{"timezone":"America\/Curacao","isp":"United Telecommunication Services
UTS)","country":"Curaçao","dma_code":"0","region_code":"00","area_code":"0",
"ip":"190.88.39.27","asn":"AS11081","continent_code":"NA","city":"Willemstad",
"longitude":-68.9167,"latitude":12.1,"country_code":"CW","country_code3":"CUW"}

It looks like Net::HTTP is assuming this is ASCII-8BIT

Net::HTTP 将数据标记为二进制/ASCII-8BIT,即数据没有编码,让您自己弄清楚如何解释数据。

关于ruby - 为 Net::HTTP 指定字符编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24195185/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com