2009-08-24 17 views
5

Niestety, kodowanie Unicode 0.1 (sudo gem install unicode) nie działa w Rubim 1.9. Mam następujący fragment:Jak zamienić klejnot Unicode na Ruby 1.9?

require "rubygems" 
require "unicode" 

str = "áéíóúç" 
Unicode.normalize_KD(str).gsub(/[^\x00-\x7F]/n, "") 
#=> aeiouc 

Używam go do konwersji tytułów na stałe, bez usuwania znaków akcentowanych.

Czy istnieje sposób konwersji takich tekstów metodami pack lub unpack?

+0

Powinieneś przeglądać archiwa ruby-talk. Jestem pewien, że w ciągu ostatnich kilku dni/tygodni autor klejnotu Unicode ogłosił tam nową wersję i jestem również całkiem pewien, że Ruby 1.9 był omawiany w tym wątku. Tak naprawdę nie czytałem wątku, więc nie mam żadnych szczegółów. –

+0

Właściwie to nie * było * klejnotem Unicode, ale klejnotem Unicode-Utils wymienianym przez @molf poniżej. (To też nie było w ciągu ostatnich kilku dni, było 3 miesiące temu.) –

Odpowiedz

13

Aktualizacja: lepszym rozwiązaniem może być użycie gem unicode_utils, który został stworzony specjalnie dla tych brakujących funkcji:

require "unicode_utils" 
UnicodeUtils.nfkd("áéíóúç").gsub(/[^\x00-\x7F]/,'').to_s 
#=> "aeiouc" 

Czy istnieje możliwość, można polegać na ActiveSupport Rails? Następnie można wykonać następujące czynności:

require "activesupport" 
mb_str = ActiveSupport::Multibyte::Chars.new("áéíóúç") 
mb_str.normalize(:kd).gsub(/[^\x00-\x7F]/,'').to_s 
#=> "aeiouc" 

ActiveSupport::Multibyte został napisany w celu zapewnienia wsparcia/Unicode UTF-8 do Ruby 1.8, ale działa dobrze w 1.9 też. Być może będziesz mógł pożyczyć część z the code, jeśli nie chcesz, aby była to zewnętrzna zależność.

+0

Niezła wymiana! Używam klejnotu Unicode na wtyczce Rails, więc jestem pewien, że mogę na nim polegać! Wielkie dzięki! Byłoby miło mieć zastępstwo używając tylko Ruby 1.9, ponieważ istnieje wiele klejnotów, które go używają i ActiveSupport może nie być wyborem dla nich wszystkich. –

+0

To właśnie o tym myślałem w powyższym komentarzu. Dzięki za przypomnienie mi o tym! Będę potrzebował tego teraz w moim projekcie zabawkowym. –

+0

Myślę, że lepiej jest używać klejnotu unicode-utils zamiast ActiveSupport podczas zastępowania unicode na klejnotach! Dzięki! ;) –

1

Istnieje również metoda I18n.transliterate('string') w Railsach. Działa jak marzenie.

+0

Nie mogę znaleźć referencji dla tej metody, czy możesz podać link do dokumentacji? Dzięki! – dgilperez

+0

'http: // apidock.com/rails/ActiveSupport/Inflector/transliterate' –

+0

Zaktualizowałem moją odpowiedź, wygląda na to, że' # to_latin' został usunięty. –

Powiązane problemy