2

在 Ruby 中将字符音译为 7 位 ASCII 的当前最佳方法是什么?我在 SO 上看到的大多数问题都是 3 或 4 年前的问题,并且解决方案不能完全起作用。

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

你的简历是一本非百科全书

你的简历不是百科全书

但我找不到这样做的方法,特别是对于将 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 的 International Components使用其 Latin-ASCII 翻译可以很好地处理翻译,但这仅适用于 Java 和 C。

更新

我最终做的是编写自己的字符翻译例程来处理标点符号和空格,之后我可以用它I18n.transliterate来完成其余的工作。我仍然更喜欢找到并使用维护良好的库函数来处理I18n没有的东西。

4

2 回答 2

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('')

这适用于所有字母。不过,它还不能正确处理撇号。

于 2013-06-18T04:34:42.937 回答
1

我猜removeaccents 脚本正是您想要的。

也许UnicodeUtils gem可能很有用,但只是为了删除重音(而不是转换像æAFAIK 这样的东西)。

于 2013-09-27T14:01:54.850 回答