文字列からUTF-8以外の文字を削除する必要があります。ここにテキストのスナップがあります。文字列からUTF-8以外の文字を削除するにはどうすればよいですか?
これは、私がNPPの文字列を開いたときのように見え、その後、UTF-8にエンコーディングを設定する方法である:
私はACK
とFF
以外だと思いますUTF-8文字。
str.scrub
とstr.encode
を試しました。どちらもうまくいかないようです。 scrub
は同じ結果を返し、encode
はエラーになります。
文字列からUTF-8以外の文字を削除する必要があります。ここにテキストのスナップがあります。文字列からUTF-8以外の文字を削除するにはどうすればよいですか?
これは、私がNPPの文字列を開いたときのように見え、その後、UTF-8にエンコーディングを設定する方法である:
私はACK
とFF
以外だと思いますUTF-8文字。
str.scrub
とstr.encode
を試しました。どちらもうまくいかないようです。 scrub
は同じ結果を返し、encode
はエラーになります。
いくつか問題があります。
Ruby Stringは、想定されているエンコーディングと一緒に任意のバイトを格納しますが、そのエンコーディングでそのバイトが有効であり、そのエンコーディングが選択された理由がないことが保証されません。 (私はPython 3の重いユーザとして偏っているかもしれません。 "文字列を1つのエンコーディングから別のものに変更する"ということは決して言わないでしょう)。
幸いにもエディタは投稿を食べていませんでした。 。私はそれを表示するために文字列をWindows-1252としてデコードしたと推測していますが、これは問題をあいまいにするだけです。
>> s = "\x06-~$A\xA7ruG\xF9\"\x9A\f\xB6/K".b
=> "\x06-~$A\xA7ruG\xF9\"\x9A\f\xB6/K"
>> s.bytes
=> [6, 45, 126, 36, 65, 167, 114, 117, 71, 249, 34, 154, 12, 182, 47, 75]
そして、それは有効なUTF-8でないバイトを含んでいます:私はそれを見るようにここで
はバイトのあなたの文字列です。
>> s.encoding
=> #<Encoding:ASCII-8BIT>
>> String::new(s).force_encoding(Encoding::UTF_8).valid_encoding?
=> false
これをUTF-8としてデコードして&#xfffd;我々は、有効なUTF-8でないバイト遭遇場所:
>> s.encode('utf-8', 'binary', :undef => :replace)
=> "\u0006-~$A�ruG�\"�\f�/K"
私はこれが私の必要と思うものだと思います。しかし、そのバイナリは何ですか?私はそれがあってもなくても同様の結果を見る。 – Yasin
私は完全にはわかりません。これはASCII_8BITと同義であり、 's'のエンコーディングが変更された場合には、わかりやすくするために使用しています。 docsは3つの形式の 'encode'メソッドを提供しており、どの呼び出しが必要であるかを実際には知ることができませんでした。 –
を、あなたは「非UTF-8」である文字について説明し、あなたはそれが事実であると信じる理由をすることはできますか? –
スクリーンショットが添付されているのを見たら、最初の文字はUTF-8ではないと思います。また、矢印は左に向かっています。ここで文字列をコピーして貼り付けると、SOサイトは自動的にその文字列を破棄しました。だから、スクリーンショットを参照してください。 – Yasin
UTF-8文字列のすべての文字は、UTF-8文字です。それ以外の場合は無効になります。コードポイント0-127はASCIIとUTF-8で同じなので、[ACK](http://www.fileformat.info/info/unicode/char/0006/index.htm)と[FF]( http://www.fileformat.info/info/unicode/char/000C/index.htm)。おそらく、制御文字や印刷できない文字を取り除きたいかもしれません。期待した結果は何ですか? – Stefan