45

在我的 Rails 应用程序中,我正在处理来自世界各地的 RSS 提要,有些提要的链接不是 UTF-8 格式。原始提要链接不受我的控制,为了在应用程序的其他部分使用它们,它们需要采用 UTF-8 格式。

如何检测编码并转换为 UTF-8?

4

4 回答 4

66

红宝石 1.9

“强制”编码很容易,但它不会转换字符只是更改编码:

str = str.force_encoding('UTF-8')

str.encoding.name # => 'UTF-8'

如果要执行转换,请使用encode

begin
  str.encode("UTF-8")
rescue Encoding::UndefinedConversionError
  # ...
end

我肯定会阅读以下帖子以获取更多信息: http:
//graysoftinc.com/character-encodings/ruby-19s-string

于 2012-10-18T06:39:06.457 回答
38

这将确保您具有正确的编码并且不会出错,因为它将任何无效或未定义的字符替换为空白字符串。

这将确保无论如何,您有一个有效的 UTF-8 字符串

str.encode(Encoding.find('UTF-8'), {invalid: :replace, undef: :replace, replace: ''})
于 2015-06-04T16:53:03.853 回答
4

图标v

require 'iconv'
i = Iconv.new('UTF-8','LATIN1')
a_with_hat = i.iconv("\xc2")

总结:iconv gem 完成了转换编码的所有工作。确保它已安装:

gem install iconv

现在,您需要知道您的字符串当前采用什么编码,因为 Ruby 1.8 将字符串视为字节数组(没有内在编码)。例如,假设您的字符串是 latin1 并且您想将其转换为 utf-8

require 'iconv'

string_in_utf8_encoding = Iconv.conv("UTF8", "LATIN1", string_in_latin1_encoding)
于 2012-10-18T05:56:45.860 回答
4

只有这个解决方案对我有用:

string.encode('UTF-8', 'binary', invalid: :replace, undef: :replace, replace: '')

请注意二进制参数。

于 2020-06-12T09:00:36.510 回答