用Ruby中的Iconv音译

当我试图音译一个西里尔字母utf-8字符串时

Iconv.iconv('ascii//ignore//translit', 'utf-8', string).to_s 

(参见问题/ 1726404 / transliteration-in-ruby )

除了那些必须被音译的符号之外,我得到了所有东西。

例如:’r-строка’→’r-‘和’Gévry’→’Gvry’。

怎么了?

Ruby 1.8.7 / Rails 2.3.5 / WSeven

 require 'iconv' p Iconv.iconv('ascii//translit//ignore', 'utf-8', 'Gévry') #=> ["Gevry"] # not 'ascii//ignore//translit' 

对于西里尔语, translit gem可能会起作用。

看来这个解决方案对我来说太棘手了。 使用stringex gem解决问题。

另一种方法是使用String的tr和gsub方法创建自定义translit而不使用iconv。

 # encoding: UTF-8 def russian_translit(text) translited = text.tr('абвгдеёзийклмнопрстуфхэыь', 'abvgdeezijklmnoprstufhey\'') translited = translited.tr('АБВГДЕЁЗИЙКЛМНОПРСТУФХЭ', 'ABVGDEEZIJKLMNOPRSTUFHEY\'') translited = translited.gsub(/[жцчшщъюяЖЦЧШЩЪЮЯ]/, 'ж' => 'zh', 'ц' => 'ts', 'ч' => 'ch', 'ш' => 'sh', 'щ' => 'sch', 'ъ' => '', 'ю' => 'ju', 'я' => 'ja', 'Ж' => 'ZH', 'Ц' => 'TS', 'Ч' => 'CH', 'Ш' => 'SH', 'Щ' => 'SCH', 'Ъ' => '', 'Ю' => 'JU', 'Я' => 'JA') return translited end p russian_translit("В чащах юга жил бы цитрус? Да, но фальшивый экземпляр!") #=> "V chaschah juga zhil by tsitrus? Da, no fal'shivyj ekzempljar!"