Ruby字符音译

wz8daaqr  于 2023-08-04  发布在  Ruby
关注(0)|答案(3)|浏览(94)

在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,但我更喜欢使用经过全面测试的支持解决方案。
International Components for Unicode通过其Latin-ASCII转换可以很好地处理转换,但这仅适用于Java和C。

更新

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

gywdnpxw

gywdnpxw1#

如果你愿意添加一些重依赖项(除非你已经在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('')

字符串
这适用于所有的字母。但它还不能正确处理撇号。

agxfikkp

agxfikkp2#

我想removeaccents script正是你想要的。
也许UnicodeUtils gem会有用,但只能用于删除重音(而不是转换æ AFAIK之类的东西)。

5n0oy7gb

5n0oy7gb3#

适用于任何区域设置:

def normalized_text
    I18n.transliterate(text.downcase.strip)
  end

字符串

相关问题