使用open-uri指定默认字符集,但如果给定

时间:2017-11-17 01:10:56

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

使用Ruby open()中的open-uri,我想从不受我控制的任意服务器中获取文件。服务器可以指定文件的内容类型,例如, 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'),但是无条件地覆盖了charset,即使服务器指定了不同的字符集,例如" ISO-8859-1。"

1 个答案:

答案 0 :(得分:0)

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

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

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