【问题标题】:UTF-8 conversion not working with String#encode but IconvUTF-8 转换不适用于 String#encode 但 Iconv
【发布时间】:2013-04-02 19:39:50
【问题描述】:

Iconv 有这个:

git_log = Iconv.conv 'UTF-8', 'iso8859-1', git_log

由于弃用警告,现在我想将其更改为使用 String#encode,但我不能,不起作用:

git_log = git_log.encode(Encoding::UTF_8, :invalid => :replace, :undef => :replace, :replace => '')

我曾经在这里使用Iconv,它仍然可以工作:

https://github.com/gamersmafia/gamersmafia/blob/master/lib/formatting.rb#L244

但是当我用 String#encode 方法替换这些行时,首先 gsub 会引发 "invalid byte sequence in UTF-8" 错误。

你知道为什么吗?

【问题讨论】:

  • 你的错误是什么?在 Ruby 1.9.3 中,您的编码调用适用于我:"Foo\U+FFC2\U+FFA3".encode(Encoding::UTF_8, :invalid => :replace, :undef => :replace, :replace => ''); => "Foo"
  • 我以前在这里使用 Iconv,它仍然可以工作:github.com/gamersmafia/gamersmafia/blob/master/lib/… 但是当我用 String#encode 方法替换这些行时,首先 gsub 会引发“UTF-8 中的无效字节序列”错误(信息添加到问题)。

标签: ruby-on-rails ruby


【解决方案1】:

在您对String#encode 的调用中,您没有指定源编码。 Ruby 使用字符串当前编码作为源,它似乎是 UTF-8,并根据the docs

请注意,从编码 enc 到相同编码 enc 的转换是无操作的,即接收者返回时不做任何更改,并且不会引发异常,即使存在无效字节也是如此。

换句话说,调用没有任何效果,并且将字符串中的字节保持原样,编码为 ISO-8859-1。对gsub 的下一次调用然后尝试将这些字节解释为 UTF-8,并且由于它们是无效的(它们与 ISO-8859-1 相比没有变化)你会得到你看到的错误。

String#encode 有一个表单,它接受源编码作为第二个参数,因此您可以显式指定它,类似于使用 Iconv 所做的。试试这个:

git_log = git_log.encode(Encoding::UTF_8,
                         Encoding::ISO_8859_1,
                         :invalid => :replace,
                         :undef => :replace,
                         :replace => '')

在这种情况下,您也可以使用! 形式,效果相同:

git_log.encode!(Encoding::UTF_8,
                Encoding::ISO_8859_1,
                :invalid => :replace,
                :undef => :replace,
                :replace => '')

【讨论】:

  • 好极了,这行得通!我很感激你也解释了发生了什么,而不是仅仅写一行代码:)
【解决方案2】:

尝试以下方法,如果字符编码错误,则从字符串中删除该字符:

invalid_character_indices = []
mystring.each_char.with_index do |char, i|
  invalid_character_indices << i unless char == char.encode(Encoding::UTF_8, Encoding::ISO_8859_1,:invalid => :replace, :undef => :replace, :replace => "")
end
invalid_character_indices.each do |i|
  mystring.delete!(mystring[i])
end

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-29
    • 1970-01-01
    • 1970-01-01
    • 2011-07-25
    • 1970-01-01
    • 2012-07-19
    • 2011-05-20
    • 1970-01-01
    相关资源
    最近更新 更多