什么是在Ruby中用ASCII等价替换所有非ASCII字符的最简单方法?

时间:2012-02-23 15:41:15

标签: ruby string encoding

  

可能重复:
  Transliteration in ruby

我正在寻找一种简单的方法来转换这些字符串:

  • “spaß”to“spass”
  • “über”to“ueber”

这是从人名生成有效用户名所必需的。

1 个答案:

答案 0 :(得分:6)

这称为音译。可以使用Iconv类来执行此近似(参见示例)。

请尝试以下方法之一(首先要求'iconv'):

Iconv.iconv('ascii//ignore//translit', 'utf-8', string).to_s
Iconv.iconv('ascii//translit', 'utf-8', string).to_s

irb(main):013:0> Iconv.iconv('ascii//translit', 'utf-8', 'spaß').to_s
=> "spass"
irb(main):014:0> Iconv.iconv('ascii//translit', 'utf-8', 'crêpes').to_s
=> "crepes"
irb(main):017:0> Iconv.iconv('ascii//translit', 'utf-8', 'über').to_s
=> "uber"

还有一个iconv命令行实用程序。关于这个和一些Ruby示例的更多信息(搜索'ruby')here

另一种选择是Unidecode,我猜这是受到原始Perl实现的启发。我没有在它的Ruby版本中使用它,但是它应该更好地进行多字符扩展(显然你想要)。

最后,如果您正在运行Rails,您可能会发现this thread很有趣。它详细说明了音译的替代方法之间的一些差异,并展示了在Rails核心(ActiveSupport::Inflector.transliterate)中执行此操作的方法