2013-05-10 34 views
16

Ponieważ utf8 MySQL nie obsługuje znaków 4-bajtowych, szukam sposobu na wykrycie i wyeliminowanie 4 bajtowych utf8 znaków z ciągu w Ruby. Rozumiem, że mogę zaktualizować tabelę, aby używać utf8m4, ale z kilku powodów, które nie są możliwe lub pożądane rozwiązanie.Jak usunąć 4-bajtowe utf-8 znaków w Ruby?

Po prostu kodowanie ciągu znaków do ASCII spowoduje usunięcie tych znaków, ale spowoduje również usunięcie wszystkich innych znaków spoza zestawu ASCII, co nie jest dobre.

Odpowiedz

30

Poniższa wydaje się działać dla mnie w Ruby 1.9.3:

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

Na przykład:

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

Dzięki! Wydaje się oczywiste, że już to zasugerowałeś. Tak głęboko zastanawiałem się nad kodowaniem, nie myślałem po prostu patrzeć na liczbę bajtów każdej postaci. – JZC

+0

Jaka jest wydajność tego z długim ciągiem? 5000+ znaków? –

+0

dziękuję dziękuję dziękuję ... nie osobiście martwisz się o wydajność, na chwilę jestem szczęśliwy, że mam działające rozwiązanie – steve