Ruby 2.0.0 String#ArgumentError:UTF-8の無効バイトシーケンス:
-
21-12-2019 - |
質問
私はこれをたくさん見て、優雅な解決策を考え出していません。ユーザー入力に無効なバイトシーケンスが含まれている場合は、例外を発生させないでください。例えば:
# @raw_response comes from user and contains invalid UTF-8
# for example: @raw_response = "\xBF"
regex.match(@raw_response)
ArgumentError: invalid byte sequence in UTF-8
.
多数の同様の質問が求められており、結果は文字列のエンコードまたは強制的なものであるようです。しかし、私のためにこれらの仕事のどちらも:
regex.match(@raw_response.force_encoding("UTF-8"))
ArgumentError: invalid byte sequence in UTF-8
.
または
regex.match(@raw_response.encode("UTF-8", :invalid=>:replace, :replace=>"?"))
ArgumentError: invalid byte sequence in UTF-8
.
これはRuby 2.0.0のバグですか、それとも私は何かが足りませんか?
奇妙なことは正しくエンコードされているようですが、一致は例外を引き上げ続けます。
@raw_response.encode("UTF-8", :invalid=>:replace, :replace=>"?").encoding
=> #<Encoding:UTF-8>
. 解決
encode
メソッドはNO OPです。現在のエンコーディングに文字列をエンコードするとき:
エンコーディング
enc
から同じエンコーディングenc
への変換は、NO OP、すなわち、無効なバイトがある場合でも、受信側は返され、例外は発生しません。
2.1で変更され、 scrub
メソッドこれを行うより簡単な方法として。
2.1にアップグレードできない場合は、無効なバイトを削除するために別のエンコードとバックにエンコードする必要があります。
if ! s.valid_encoding?
s = s.encode("UTF-16be", :invalid=>:replace, :replace=>"?").encode('UTF-8')
end
. 他のヒント
RubyだけではなくRubyだけではなく、 tidy_bytesを使用することもできます。。これはRuby 2.0で動作し、さらに交換文字だけではなく賢明なデータを返すでしょう。
所属していません StackOverflow