【问题标题】:Specify default charset using open-uri but use server-provided charset if given使用 open-uri 指定默认字符集,但如果给定则使用服务器提供的字符集
【发布时间】:2023-03-18 19:50:01
【问题描述】:

使用 Ruby 的 open-uri 中的 open(),我想从不受我控制的任意服务器中获取文件。服务器可以为文件指定一个 Content-Type,例如text/calendar; charset=utf-8text/calendar; charset=ISO-8859-1,在这种情况下,我很高兴 open() 会相信该字符集是服务器声称的任何内容。但是,如果服务器没有指定字符集,那么open() 似乎假定字符集是“ASCII-8BIT”。我想让open() 改为假设字符集是“UTF-8”(当没有指定字符集时),因为text/calendar,即“iCal 文件”,通常应该编码为“UTF -8。”

我强调只假设字符集当没有指定字符集时,因为我仍然想尊重服务器的决定,可以选择以他们喜欢的任何字符集提供文件。

我尝试了open('http://my-test-uri.test', 'r:UTF-8'),但它无条件地覆盖了字符集,即使服务器指定了不同的字符集,例如“ISO-8859-1”。

【问题讨论】:

    标签: ruby utf-8 character-encoding open-uri


    【解决方案1】:

    OpenURI::Meta#charset 接受一个块,该块仅在服务器未指定字符集时才会返回一个字符集。

    使用该信息,我们可以将open 返回的StringIO 的编码设置为与它(冗余)相同的编码或我们的默认编码:

    open('http://localhost:3333').tap do |io|
      charset = io.charset { 'utf-8' }
      io.set_encoding(charset)
    end
    

    【讨论】:

      猜你喜欢
      • 2011-09-18
      • 1970-01-01
      • 2012-09-01
      • 1970-01-01
      • 2012-09-06
      • 2021-08-03
      • 1970-01-01
      • 1970-01-01
      • 2021-09-03
      相关资源
      最近更新 更多