首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >红宝石字符音译

红宝石字符音译
EN

Stack Overflow用户
提问于 2013-06-18 04:00:19
回答 2查看 3.1K关注 0票数 2

在Ruby中,将字符音译为7位ASCII的最佳方法是什么?我所见过的大多数问题都是3到4岁,解决方案并不完全奏效。

我想要一种适用于范围广泛的拉丁字母的方法,例如转换

你的简历是个非encyclop dia

你的简历不是百科全书

但我找不到这样的方法,尤其是8位ASCII到7位ASCII的折叠。

代码语言:javascript
复制
s =  "Your r\u00e9sum\u00e9\u2019s a non\u2013encyclop\u00e6dia"
puts Iconv.iconv('ascii//ignore//translit', 'utf-8', s)
# => Your r'esum'e's a non-encyclopaedia
puts s.encode('ascii//ignore//translit', 'utf-8')
# => Encoding::ConverterNotFoundError: code converter not found (UTF-8 to ascii//ignore//translit)
puts s.encode('ascii', 'utf-8')
# Encoding::UndefinedConversionError: U+00E9 from UTF-8 to US-ASCII
puts s.encode('ascii', 'utf-8', invalid: :replace, undef: :replace)
# Your r?sum??s a non?encyclop?dia
puts I18n.transliterate(s)
# Your resume?s a non?encyclopaedia

既然Iconv不受欢迎,我宁愿不用它,但如果这是唯一有效的方法,我会这么做的。显然,我可以自定义8位ASCII到7位ASCII翻译,但我更喜欢使用经过彻底测试的受支持的解决方案。

Unicode的国际组件在拉丁语-ASCII翻译中处理得很好,但这只适用于Java和C。

更新

最后我做的是写我自己的字符翻译例程来处理标点符号和空格,然后我可以用I18n.transliterate来完成剩下的工作。我仍然希望找到并使用一个维护良好的库函数来处理I18n不需要的东西。

EN

回答 2

Stack Overflow用户

发布于 2013-06-18 04:34:42

如果您愿意添加某种程度的依赖(除非您已经在Rails上),ActiveSupport对此提供了支持(不是双关语):

代码语言:javascript
复制
ActiveSupport::Multibyte::Chars.new("Your r\u00e9sum\u00e9\u2019s not an encyclop\u00e6dia").mb_chars.normalize(:kd).chars.to_a.delete_if {|c| !c.ascii_only?}.join('')

这适用于所有的信件。不过,它还没有正确处理撇号。

票数 5
EN

Stack Overflow用户

发布于 2013-09-27 14:01:54

我想移除口音脚本正是你想要的。

也许UnicodeUtils宝石是有用的,但只用于删除重音(而不是转换像æ AFAIK这样的东西)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17160328

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档