問題兩個最好的方法來做到這一點,但Martijn做了一個可以理解的b當在這裏複製第二種方法到他的答案時,不正確的改變。做.encode('UTF-8',<選項>).encode('UTF-8')不起作用。正如在另一個問題的原始答案中所指出的那樣,關鍵在於編碼爲不同的編碼,然後返回到UTF-8。如果您的原始字符串已經在ruby的內部標記爲UTF-8,那麼ruby將忽略任何調用將其編碼爲UTF-8。
在以下示例中,我將使用「a#{0xFF.chr} b」.force_encoding('UTF-8')生成一個字符串,該字符串認爲是UTF-8但包含無效的UTF-8字節。
1.9.3p194 :019 > "a#{0xFF.chr}b".force_encoding('UTF-8')
=> "a\xFFb"
1.9.3p194 :020 > "#{0xFF.chr}".force_encoding('UTF-8').encoding
=> #<Encoding:UTF-8>
注編碼成UTF-8怎麼什麼都不做:
1.9.3p194 :016 > "a#{0xFF.chr}b".force_encoding('UTF-8').encode('UTF-8', :invalid => :replace, :replace => '').encode('UTF-8')
=> "a\xFFb"
但編碼到別的東西(UTF-16),然後返回到UTF-8清理字符串:
1.9.3p194 :017 > "a#{0xFF.chr}b".force_encoding('UTF-8').encode('UTF-16', :invalid => :replace, :replace => '').encode('UTF-8')
=> "ab"
我認爲你正在嘗試的是非常危險的。文本編碼就像懷孕一樣:要麼有UTF8,要麼沒有。你不能只有一點UTF8。如果有錯誤,你*有*放棄。否則,您的轉換器可能容易受到惡意準備字符串的攻擊。 – 2012-02-03 10:06:17
我正在寫一個履帶式,那裏有一個網頁,有點無效。因此清理字節是我所能做的。 – lulalala 2012-02-03 10:40:25