目前在Ruby中将字符音译为7位ASCII的最佳方法是什么?我在SO上看到的大多数问题都是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转换,但我更喜欢使用经过全面测试的支持解决方案。
International Components for Unicode及其Latin-ASCII翻译可以很好地处理翻译,但这只适用于Java和C.
我最终做的是编写自己的角色翻译例程来处理标点符号和空格,之后我可以使用I18n.transliterate
来完成剩下的工作。我仍然希望找到并使用维护良好的库函数来处理I18n
没有的东西。
答案 0 :(得分:5)
如果你愿意添加一些有点沉重的依赖(除非你已经在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('')
这适用于所有字母。尽管如此,它还没有处理撇号。
答案 1 :(得分:1)
我想removeaccents script恰到好处。
也许UnicodeUtils gem可能有用,但只能删除重音符号(不能转换æ
AFAIK之类的内容。