Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Ruby 1.9.1中将Net::HTTP响应转换为特定的编码?_Ruby_Http_Encoding_Sinatra_Ruby 1.9 - Fatal编程技术网

如何在Ruby 1.9.1中将Net::HTTP响应转换为特定的编码?

如何在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 如果我使用

我有一个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

    如果我使用Nokogiri::HTML(response.body)并使用css选择器从页面中获取特定内容(例如标题标记的内容),我会得到一个字符串,当我调用string.encoding时,该字符串返回WINDOWS-1256。我使用string.encode(“utf-8”)并使用它发送响应,但响应仍然不正确


    对我的方法中的错误有什么建议或想法吗?

    我发现下面的代码现在适合我

    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你救了我的白马王子