2017-08-15 11 views
-2

文字列からUTF-8以外の文字を削除する必要があります。ここにテキストのスナップがあります。文字列からUTF-8以外の文字を削除するにはどうすればよいですか?

enter image description here

これは、私がNPPの文字列を開いたときのように見え、その後、UTF-8にエンコーディングを設定する方法である:

enter image description here

私はACKFF以外だと思いますUTF-8文字。

str.scrubstr.encodeを試しました。どちらもうまくいかないようです。 scrubは同じ結果を返し、encodeはエラーになります。

+3

を、あなたは「非UTF-8」である文字について説明し、あなたはそれが事実であると信じる理由をすることはできますか? –

+0

スクリーンショットが添付されているのを見たら、最初の文字はUTF-8ではないと思います。また、矢印は左に向かっています。ここで文字列をコピーして貼り付けると、SOサイトは自動的にその文字列を破棄しました。だから、スクリーンショットを参照してください。 – Yasin

+1

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

答えて

2

いくつか問題があります。

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" 
+0

私はこれが私の必要と思うものだと思います。しかし、そのバイナリは何ですか?私はそれがあってもなくても同様の結果を見る。 – Yasin

+0

私は完全にはわかりません。これはASCII_8BITと同義であり、 's'のエンコーディングが変更された場合には、わかりやすくするために使用しています。 docsは3つの形式の 'encode'メソッドを提供しており、どの呼び出しが必要であるかを実際には知ることができませんでした。 –

関連する問題