如何在Ruby 1.9.1中将Net::HTTP响应转换为特定的编码?
我有一个Sinatra应用程序()可以执行以下操作如何在Ruby 1.9.1中将Net::HTTP响应转换为特定的编码?,ruby,http,encoding,sinatra,ruby-1.9,Ruby,Http,Encoding,Sinatra,Ruby 1.9,我有一个Sinatra应用程序()可以执行以下操作 检索HTML页面(通过net/http) 从response.body创建Nokogiri文档 提取一些信息并在响应中发回。响应应为UTF-8编码 所以我在阅读使用windows-1256编码的网站时遇到了这个问题,比如www.filfan.com或www.masrawy.com 问题是编码转换的结果不正确,尽管没有抛出错误 net/http response.body.encoding提供无法转换为UTF-8的ASCII-8BIT 如果我使用
对我的方法中的错误有什么建议或想法吗?我发现下面的代码现在适合我
def document
if @document.nil? && response
@document = if document_encoding
Nokogiri::HTML(response.body.force_encoding(document_encoding).encode('utf-8'),nil, 'utf-8')
else
Nokogiri::HTML(response.body)
end
end
@document
end
def document_encoding
return @document_encoding if @document_encoding
response.type_params.each_pair do |k,v|
@document_encoding = v.upcase if k =~ /charset/i
end
unless @document_encoding
#document.css("meta[http-equiv=Content-Type]").each do |n|
# attr = n.get_attribute("content")
# @document_encoding = attr.slice(/charset=[a-z1-9\-_]+/i).split("=")[1].upcase if attr
#end
@document_encoding = response.body =~ /<meta[^>]*HTTP-EQUIV=["']Content-Type["'][^>]*content=["'](.*)["']/i && $1 =~ /charset=(.+)/i && $1.upcase
end
@document_encoding
end
def文档
如果@document.nil?&&响应
@文档=如果文档编码
Nokogiri::HTML(response.body.force_编码(document_编码).encode('utf-8'),nil,'utf-8'))
其他的
Nokogiri::HTML(response.body)
结束
结束
@文件
结束
def文件编码
如果@document\u encoding,则返回@document\u encoding
response.type_params.每对do | k,v|
@如果k=~/charset/i,则document\u encoding=v.upcase
结束
除非@document\u编码
#css(“meta[http equiv=Content Type]”)。每个do|
#attr=n.get_属性(“内容”)
#@document_encoding=attr.slice(/charset=[a-z1-9\-\-\\+/i).拆分(“=”[1]。如果attr
#结束
@document_encoding=response.body=~/]*HTTP-EQUIV=[“]”内容类型[“]”][^>]*内容=[“”](.*)[“]”]/i&&$1=~/charset=(.+)/i&&$1.upcase
结束
@文件编码
结束
因为Net::HTTP不能正确处理编码。看
您可以解析包含字符集的response['content-type']
,而不是解析整个response.body
然后使用force_encoding()
设置正确的编码
response.body.force_encoding(“UTF-8”)
如果站点以UTF-8提供服务。虽然此解决方案确实有效,但此问题仅在某些站点发生在我身上。也许当内容类型包括“application/json”时,它会用UTF-8编码。。。?根据,application/json意味着UTF-8。下一个逻辑步骤是调用.encode!('UTF-8'),然后执行实际的processing@DmitryVyal你救了我的白马王子