ASCII-8BIT is an alias for BINARY
open-uri
做了一件有趣的事:如果文件小于 10kb(或类似的东西),它返回 a String
,如果它更大,则返回 a StringIO
。如果您尝试处理编码问题,这可能会令人困惑。
如果文件不是很大,我建议手动将它们加载到字符串中:
require 'uri'
require 'net/http'
require 'net/https'
uri = URI.parse url_to_file
http = Net::HTTP.new(uri.host, uri.port)
if uri.scheme == 'https'
http.use_ssl = true
# possibly useful if you see ssl errors
# http.verify_mode = ::OpenSSL::SSL::VERIFY_NONE
end
body = http.start { |session| session.get uri.request_uri }.body
然后你可以使用https://rubygems.org/gems/ensure-encoding gem
require 'ensure/encoding'
utf8_body = body.ensure_encoding('UTF-8', :external_encoding => :sniff, :invalid_characters => :transcode)
我很满意ensure-encoding
......我们在http://data.brighterplanet.com的生产中使用它
请注意,您也可以说:invalid_characters => :ignore
而不是:transcode
。
另外,如果您以某种方式知道编码,则可以传递:external_encoding => 'ISO-8859-1'
而不是:sniff