从任何编码强制字符串为 UTF-8

Posted

技术标签:

【中文标题】从任何编码强制字符串为 UTF-8【英文标题】:Force strings to UTF-8 from any encoding 【发布时间】:2012-10-08 12:19:09 【问题描述】:

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

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

【问题讨论】:

要检测编码,需要解析文档附带的元信息,即HTTP头或<meta>标签。 【参考方案1】:

红宝石 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

【讨论】:

不起作用:whois = whois.force_encoding("UTF-8") \n whois.encoding.name => "UTF-8" \n whois.scan(/role:\s+ (.+)/i) -- 抛出:ArgumentError: UTF-8 中的无效字节序列 如前所述,force_encoding 不会转换字符,当然也不能神奇地解释无效的 UTF-8 字节序列。 Ruby 2.2.0 及更高版本的当前语法为:str.force_encoding(Encoding::UTF_8)Encoding【参考方案2】:

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

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

str.encode(Encoding.find('UTF-8'), invalid: :replace, undef: :replace, replace: '')

【讨论】:

【参考方案3】:

Iconv

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)

【讨论】:

感谢您的回答,但在我的情况下,源数据不一致,我真的没有可靠的方法来抢占编码 Iconv 不应再使用。 (已弃用)***.com/questions/8148762/…【参考方案4】:

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

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

注意 binary 参数。

【讨论】:

以上是关于从任何编码强制字符串为 UTF-8的主要内容,如果未能解决你的问题,请参考以下文章

django rest_framework中将json输出字符强制为utf-8编码

强制从 US-ASCII 编码为 UTF-8 (iconv)

使用标准 .Net 功能/BCL 将任何类型的编码输入字符串转换为 UTF-8

如何在 C# 中将字符串转换为 UTF-8?

如何在C#中将字符串转换为UTF-8?

编码 4 字节 UTF-8 字符 ????从 Rails 到 JSON 产生无效字符