ある種の入力から読み取った文字列があります。
私の知る限りでは、UTF8です。わかった:
string.force_encoding("utf8")
しかし、この文字列に実際には正当なUTF8ではないバイトが含まれている場合は、今すぐ知り、アクションを実行したいと思います。
通常、force_encoding( "utf8")は、そのようなバイトに遭遇した場合に発生しますか?そうはならないと思います。
#encodeを実行している場合は、ソースエンコーディング(またはデスティネーションエンコーディング)で無効な文字を処理するための便利なオプションから選択できます。
しかし、私は#encodeを実行しているのではなく、#force_encodingを実行しています。そのようなオプションはありません。
それは理にかなっていますか
string.force_encoding("utf8").encode("utf8")
すぐに例外を取得するには?通常、utf8からutf8へのエンコードは意味がありません。しかし、おそらくこれは、無効なバイトがある場合にすぐにレイズさせる方法ですか?または、:replace
オプションなどを使用して、無効なバイトで別のことを行いますか?
しかし、いや、それもうまくいくようには思えない。
誰か知ってる?
1.9.3-p0 :032 > a = "bad: \xc3\x28 okay".force_encoding("utf-8")
=> "bad: \xC3( okay"
1.9.3-p0 :033 > a.valid_encoding?
=> false
わかりましたが、これらの不良バイトを見つけて削除するにはどうすればよいですか?奇妙なことに、これは発生しません:
1.9.3-p0 :035 > a.encode("utf-8")
=> "bad: \xC3( okay"
私が別のエンコーディングに変換しているとしたら、そうなるでしょう!
1.9.3-p0 :039 > a.encode("ISO-8859-1")
Encoding::InvalidByteSequenceError: "\xC3" followed by "(" on UTF-8
または、私がそれを言った場合、それは「?」に置き換えられます =>
1.9.3-p0 :040 > a.encode("ISO-8859-1", :invalid => :replace)
=> "bad: ?( okay"
したがって、rubyは、utf-8の不良バイトを認識し、別のエンコーディングに変換するときにemを別のものに置き換えることができます。しかし、別のエンコーディングに変換したくないので、utf8のままにしておきたいのですが、そこに無効なバイトがある場合はレイズしたい場合や、無効なバイトを置換文字に置き換えたい場合があります。
これを行うためにルビーを取得する方法はありませんか?
更新これは2.1で最終的にrubyに追加され、これを行うために2.1プレビューリリースにString#scrubが存在すると思います。だからそれを探してください!