2013-05-10 12 views
16

Poiché utf8 di MySQL non supporta caratteri a 4 byte, sto cercando un modo per rilevare ed eliminare qualsiasi carattere utf8 da 4 byte di una stringa in Ruby. Capisco che posso aggiornare il mio tavolo per utilizzare utf8m4 ma per un paio di motivi che non è possibile o la soluzione desiderata.Come rimuovere 4 byte utf-8 caratteri in Ruby?

Semplicemente la codifica della stringa in ASCII rimuoverà questi caratteri ma rimuoverà anche tutti gli altri caratteri non ASCII, il che non è buono.

risposta

30

Quanto segue sembra funzionare per me in Ruby 1.9.3:

input.each_char.select{|c| c.bytes.count < 4 }.join('') 

Ad esempio:

input = "hello \xF0\xA9\xB6\x98 world"     # includes U+29D98 
input.each_char.select{|c| c.bytes.count < 4 }.join('') # 'hello world' 
+0

Grazie! Sembra ovvio ora che lo hai suggerito. Ero così profondamente a pensare alle codifiche, non pensavo di guardare semplicemente il conteggio dei byte di ogni personaggio. – JZC

+0

Come è la performance di questo con una stringa lunga? Più di 5000 caratteri? –

+0

grazie grazie grazie ... non personalmente preoccupato per le prestazioni, per il momento sono felice di avere una soluzione funzionante – steve

Problemi correlati