2013-04-02 36 views
3

我有這個用語言Iconv:UTF-8的轉換不是字符串編碼#工作,但語言Iconv

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

現在我想改變它用String#編碼,由於廢棄警告,但我不能,不工作:

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#編碼方法替換這些行時,首先gsub引發了一個「UTF-8中的無效字節序列」錯誤。

你知道爲什麼嗎?

+2

你的錯誤是什麼?在Ruby 1.9.3中,您的編碼調用適用於我:'「Foo \ U + FFC2 \ U + FFA3」.encode(Encoding :: UTF_8,:invalid =>:replace,:undef =>:replace,:replace = >''); =>「Foo」' –

+0

我以前在這裏使用Iconv,它仍然在工作:https://github.com/gamersmafia/gamersmafia/blob/master/lib/formatting.rb#L244但是,當我用String替換這些行#encode方法,首先gsub引發一個「UTF-8中無效的字節序列」錯誤(信息添加到問題中)。 – Draco

回答

6

在您撥打String#encode時,您不指定源編碼。紅寶石使用字符串當前編碼爲源,這似乎是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 => '') 
+0

卓越,這個作品!我感謝你也解釋了發生了什麼,而不是隻是放一行代碼:) – Draco

0

試試下面的方法,它從一個字符串刪除字符如果字符是mal-encoded:

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