質問

私はこれをたくさん見て、優雅な解決策を考え出していません。ユーザー入力に無効なバイトシーケンスが含まれている場合は、例外を発生させないでください。例えば:

# @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で動作し、さらに交換文字だけではなく賢明なデータを返すでしょう。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top