我在 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 会引发 “UTF-8 中的无效字节序列” 错误。

你知道为什么吗?

最佳答案

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



换句话说,该调用没有任何效果,并且将字符串中的字节保留原样,编码为 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 => '')

关于ruby-on-rails - UTF-8 转换不适用于 String#encode 但不适用于 Icon,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15772887/

10-12 00:04
查看更多