如何在Ruby中将字符串中的西里尔符号音译为拉丁语?我找不到任何关于此的文档。我认为应该有一些标准功能。
答案 0 :(得分:8)
您可以使用the translit
gem:
require 'translit'
str = "Кириллица"
Translit.convert(str, :english)
#=> "Kirillica"
答案 1 :(得分:5)
使用西里尔语/俄语最成熟的宝石是https://github.com/yaroslav/russian/
它还支持音译以及许多其他服务:
require 'russian'
# => true
Russian.translit('Транслит, english letters untouched')
# => "Translit, english letters untouched"
它还提供多元化,日期格式化,Rails i18n集成和许多其他好东西。
免责声明:我对宝石没有任何意义,只是快乐的用户。
答案 2 :(得分:1)
这就是宝石。我没有尝试过,但听起来很有希望......
答案 3 :(得分:0)
def transliterate cyrillic_string
ru = { 'а' => 'a', 'б' => 'b', 'в' => 'v', 'г' => 'g', 'д' => 'd', \
'е' => 'e', 'ё' => 'e', 'ж' => 'j', 'з' => 'z', 'и' => 'i', \
'к' => 'k', 'л' => 'l', 'м' => 'm', 'н' => 'n', 'о' => 'o', \
'п' => 'p', 'р' => 'r', 'с' => 's', 'т' => 't', 'у' => 'u', \
'ф' => 'f', 'х' => 'h', 'ц' => 'c', 'ч' => 'ch', 'ш' => 'sh', \
'щ' => 'shch', 'ы' => 'y', 'э' => 'e', 'ю' => 'u', 'я' => 'ya', \
'й' => 'i', 'ъ' => '', 'ь' => ''}
identifier = ''
cyrillic_string.downcase.each_char do |char|
identifier += ru[char] ? ru[char] : char
end
identifier.gsub!(/[^a-z0-9_]+/, '_'); # remaining non-alphanumeric => hyphen
identifier.gsub(/^[-_]*|[-_]*$/, ''); # remove hyphens/underscores and numbers at beginning and hyphens/underscores at end
end
答案 4 :(得分:0)
我不想添加依赖项,只想在脚本中添加一个简单的东西,所以我这样做了:
transmap = [["кс", "x"], ["Кс", "X"], ["а", "a"], ["А", "A"], ["б", "b"], ["Б", "B"], ["в", "v"], ["В", "V"], ["г", "g"], ["Г", "G"], ["д", "d"], ["Д", "D"], ["е", "e"], ["Е", "E"], ["ё", "yo"], ["Ё", "Yo"], ["ё", "jo"], ["Ё", "Jo"], ["ё", "ö"], ["Ё", "Ö"], ["ж", "zh"], ["Ж", "Zh"], ["з", "z"], ["З", "Z"], ["и", "i"], ["И", "I"], ["й", "j"], ["Й", "J"], ["к", "k"], ["К", "K"], ["л", "l"], ["Л", "L"], ["м", "m"], ["М", "M"], ["н", "n"], ["Н", "N"], ["о", "o"], ["О", "O"], ["п", "p"], ["П", "P"], ["р", "r"], ["Р", "R"], ["с", "s"], ["С", "S"], ["т", "t"], ["Т", "T"], ["у", "u"], ["У", "U"], ["ф", "f"], ["Ф", "F"], ["х", "h"], ["Х", "H"], ["ц", "ts"], ["Ц", "Ts"], ["ч", "ch"], ["Ч", "Ch"], ["ш", "sh"], ["Ш", "Sh"], ["в", "w"], ["В", "W"], ["щ", "shch"], ["Щ", "Shch"], ["щ", "sch"], ["Щ", "Sch"], ["ъ", "#"], ["Ъ", "#"], ["ы", "y"], ["Ы", "Y"], ["ь", ""], ["Ь", ""], ["э", "je"], ["Э", "Je"], ["э", "ä"], ["Э", "Ä"], ["ю", "yu"], ["Ю", "Yu"], ["ю", "ju"], ["Ю", "Ju"], ["ю", "ü"], ["Ю", "Ü"], ["я", "ya"], ["Я", "Ya"], ["я", "ja"], ["Я", "Ja"], ["я", "q"], ["Я", "Q"]]
translit = ->(string) { transmap.inject(string) { |s, (k, v)| s.gsub(k, v) } }
translit.call("Пoo") # "Poo"
请注意,Translit 将相同的西里尔字母映射到多个拉丁字符串,例如"я" 到 "q" and "ja" and "ya" – 所以这个代码(如 Translit)当然只会选择其中之一。
就是这样,但细节如下。
我使用以下代码段从 https://github.com/tjbladez/translit/blob/master/lib/translit.rb 生成了 transmap
:
transmap = translit_map.flat_map { |k, (up, down)| [ [ down, k ], [ up, k.capitalize ] ] }.sort_by { |k, _| -k.length }
它需要按最长优先排序,所以它在单字母音译之前执行 кс => x。