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 としてエンコードされたままになります。thenの次の呼び出しはgsub、これらのバイトを UTF-8 として解釈しようとしますが、それらは無効であるため (ISO-8859-1 から変更されていないため)、表示されるエラーが発生します。

String#encodeには、ソース エンコーディングを 2 番目のパラメータとして受け入れる形式があるため、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 に答える