在Ruby中,将字符音译为7位ASCII的最佳方法是什么?我所见过的大多数问题都是3到4岁,解决方案并不完全奏效。
我想要一种适用于范围广泛的拉丁字母的方法,例如转换
你的简历是个非encyclop dia
至
你的简历不是百科全书
但我找不到这样的方法,尤其是8位ASCII到7位ASCII的折叠。
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不需要的东西。
发布于 2013-06-18 04:34:42
如果您愿意添加某种程度的依赖(除非您已经在Rails上),ActiveSupport对此提供了支持(不是双关语):
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('')这适用于所有的信件。不过,它还没有正确处理撇号。
发布于 2013-09-27 14:01:54
我想移除口音脚本正是你想要的。
也许UnicodeUtils宝石是有用的,但只用于删除重音(而不是转换像æ AFAIK这样的东西)。
https://stackoverflow.com/questions/17160328
复制相似问题