2010-09-08 91 views
1

我剛剛升級到紅寶石1.92,我的一個猴子補丁失敗,出現某種編碼錯誤。我有以下功能:不兼容的字符編碼:UTF-8和ASCII-8BIT紅寶石1.9

def strip_noise() 
    return if (!self) || (self.size == 0) 

    self.delete(160.chr+194.chr).gsub(/[,]/, "").strip 
    end 

那現在給我下面的錯誤:

incompatible character encodings: UTF-8 and ASCII-8BIT

有任何人碰到這種?

+0

歡迎Ruby 1.9的美麗新世界字符編碼!您可能需要[閱讀主題](http://blog.grayproductions.net/categories/character_encodings)。 – ewall 2010-09-08 13:46:28

回答

0

這可能不是你想要什麼:

def strip_noise 
    return if empty? 
    sub = 160.chr.force_encoding(encoding) + 194.chr.force_encoding(encoding) 
    delete(sub).gsub(/[,]/, "").strip 
    end 

更多的話題在這裏:http://yehudakatz.com/2010/05/17/encodings-unabridged/

+0

我現在得到「UTF-8中的無效字節序列」。 160.chr和194.chr是不是有效的UTF-8字符? – dagda1 2010-09-08 14:45:24

+0

鄧諾,顯然不是。爲什麼不把實際字符放在那裏而不是字節。或者將字符串本身轉換爲ASCII-8BIT? – 2010-09-10 08:04:04

1

這是目前反正工作對我來說:

class String 
    def strip_noise() 
    return if empty? 
    self.mb_chars.normalize(:kd).gsub(/[^\x00-\x7F]/n,'') 
    end 
end 

我需要做更多的測試,但我可以進步..

0

這不是enti清楚你在這裏試圖做什麼,但160.chr+194.chr是無效的UTF-8:160是繼續字節,194是2字節字符的第一個字節。相反,它們形成了「非破壞性空間」的unicode字符。

如果你想刪除所有非ASCII-7字符,試試這個:

s.delete!("^\u{0000}-\u{007F}") 
1
class String 
    def strip_noise 
    return if empty? 
    ActiveSupport::Inflector.transliterate self, '' 
    end 
end 

"#{160.chr}#{197.chr} string with noises" # => "\xA0\xC5 string with noises" 
"#{160.chr}#{197.chr} string with noises".strip_noise # => "A string with noises"