2017-08-15 108 views
-2

我需要從字符串中刪除非UTF-8字符。這是文本的快照。如何從字符串中刪除非UTF-8字符?

enter image description here

這是它的外觀,當我打開NPP串等,然後將編碼設置爲UTF-8:

enter image description here

我覺得ACKFF是非UTF-8字符。

我試過str.scrub以及str.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字符串會存儲任意字節以及假定的編碼,但不能保證該字節在該編碼中是有效的,並且沒有明顯的理由選擇該編碼。 (我可能會偏向Python 3的重度用戶。我們永遠不會說「將字符串從一種編碼更改爲另一種編碼」)。

幸運的是,編輯沒有吃掉你的帖子,但很難看到。我猜你已將字符串解碼爲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'的編碼已經改變了。文檔給出了'encode'方法的三種形式,我無法確切知道需要哪種調用。 –