3

我和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 中的无效字节序列”错误。

你知道为什么吗?

4

2 回答 2

6

在您打电话给String#encode您时,请不要指定源编码。Ruby 使用字符串当前编码作为源,它似乎是 UTF-8,并且根据文档

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

换句话说,调用没有任何效果,并且将字符串中的字节保持原样,编码为 ISO-8859-1。下一次调用gsubthen 尝试将这些字节解释为 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 => '')
于 2013-04-02T21:08:28.253 回答
0

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

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
于 2016-08-29T16:35:00.717 回答