我在 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/