使用Ruby open()
中的open-uri
,我想从不受我控制的任意服务器中获取文件。服务器可以指定文件的内容类型,例如, text/calendar; charset=utf-8
或text/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。"
答案 0 :(得分:0)
OpenURI::Meta#charset
接受一个块,只有在服务器没有指定一个字符集时才会返回一个字符集。
使用该信息,我们可以将StringIO
返回的open
的编码设置为(冗余)相同的编码或默认值:
open('http://localhost:3333').tap do |io|
charset = io.charset { 'utf-8' }
io.set_encoding(charset)
end