在我的rails应用程序中,我使用来自世界各地的RSS提要,有些提要的链接不是UTF-8。原始的提要链接不受我的控制,为了在应用程序的其他部分使用它们,它们需要使用UTF-8。如何检测编码并转换为UTF-8?
6fe3ivhb1#
Ruby 1.9“强制”编码很容易,但它不会转换字符,只是改变编码:
str = str.force_encoding('UTF-8') str.encoding.name # => 'UTF-8'
如果要执行转换,请使用encode:
encode
begin str.encode("UTF-8") rescue Encoding::UndefinedConversionError # ... end
我一定会阅读以下文章以获得更多信息:http://graysoftinc.com/character-encodings/ruby-19s-string
hts6caw32#
这将确保您具有正确的编码,并且不会出错,因为它将任何无效或未定义的字符替换为空字符串。这将确保无论如何,您都有一个有效的UTF-8字符串
str.encode(Encoding.find('UTF-8'), {invalid: :replace, undef: :replace, replace: ''})
对于Ruby 3.0+:
str.encode(Encoding.find('UTF-8'), invalid: :replace, undef: :replace, replace: '')
7vux5j2d3#
只有这个解决方案对我有效:
string.encode('UTF-8', 'binary', invalid: :replace, undef: :replace, replace: '')
注意binary参数。
d6kp6zgx4#
伊孔夫
require 'iconv' i = Iconv.new('UTF-8','LATIN1') a_with_hat = i.iconv("\xc2")
概要:iconv gem完成了所有转换编码的工作。请确保安装了:
gem install iconv
现在,您需要知道字符串当前使用的是什么编码,因为Ruby 1.8将字符串视为字节数组(没有固有编码)。例如,假设字符串使用的是latin 1,您希望将其转换为utf-8。
require 'iconv' string_in_utf8_encoding = Iconv.conv("UTF8", "LATIN1", string_in_latin1_encoding)
4条答案
按热度按时间6fe3ivhb1#
Ruby 1.9
“强制”编码很容易,但它不会转换字符,只是改变编码:
如果要执行转换,请使用
encode
:我一定会阅读以下文章以获得更多信息:
http://graysoftinc.com/character-encodings/ruby-19s-string
hts6caw32#
这将确保您具有正确的编码,并且不会出错,因为它将任何无效或未定义的字符替换为空字符串。
这将确保无论如何,您都有一个有效的UTF-8字符串
对于Ruby 3.0+:
7vux5j2d3#
只有这个解决方案对我有效:
注意binary参数。
d6kp6zgx4#
伊孔夫
概要:iconv gem完成了所有转换编码的工作。请确保安装了:
现在,您需要知道字符串当前使用的是什么编码,因为Ruby 1.8将字符串视为字节数组(没有固有编码)。例如,假设字符串使用的是latin 1,您希望将其转换为utf-8。