在 Ruby 中使用 Iconv 进行音译

发布于 2024-10-07 15:23:32 字数 388 浏览 6 评论 0原文

当我尝试使用

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

(参见 questions/1726404/transliteration-in-ruby< /a>)

我得到了除了那些必须音译的符号之外的所有内容。

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

怎么了?

Ruby 1.8.7 / Rails 2.3.5 / WSeven

When I'm trying to transliterate a Cyrillic utf-8 string with

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

(see questions/1726404/transliteration-in-ruby)

I'm getting everything but those symbols that have to be transliterated.

For example: 'r-строка' → 'r-' and 'Gévry' → 'Gvry'.

What's wrong?

Ruby 1.8.7 / Rails 2.3.5 / WSeven

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

欲拥i 2024-10-14 15:23:32
require 'iconv'
p Iconv.iconv('ascii//translit//ignore', 'utf-8',  'Gévry') #=> ["Gevry"]
# not         'ascii//ignore//translit'

对于西里尔语, translit gem 可能有效。

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

For Cyrillic the translit gem might work.

在风中等你 2024-10-14 15:23:32

看来解决方案太棘手了为我。使用 stringex gem 解决了问题。

It seems the solution is too tricky for me. Problem solved using stringex gem.

舞袖。长 2024-10-14 15:23:32

另一种方法是通过 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!"

Another way is to create custom translit by tr and gsub methods of String without using 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!"
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文