【问题标题】:Whats the easiest way to replace all non ASCII characters with their ASCII equivalents in Ruby? [duplicate]用 Ruby 中的 ASCII 等价物替换所有非 ASCII 字符的最简单方法是什么? [复制]
【发布时间】:2012-02-23 15:41:15
【问题描述】:

可能重复:
Transliteration in ruby

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

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

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

【问题讨论】:

  • 只有德语?你想用ê 表示单词的起源是crespes 之类的crêpes 来做什么? naïvetéça va 呢?根据另一个网站,“Georg Friedrich Händel 被德国人简化为“Haendel”,英国人简化为“Handel”(后者是他搬到伦敦时自己使用的拼写)。”那么你怎么知道该选哪个呢?

标签: ruby string encoding


【解决方案1】:

这称为音译。可以使用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)

【讨论】:

  • +1 好答案;我以前不知道“音译”这个词,所以谢谢!有趣的是,über 的转换与 OP 的预期结果不匹配。 OP 想要在其中抛出 e 是错误的,还是音译库与语言无关?
  • 我认为它与语言无关。 Unidecode 发行版附带了相当广泛的数据文件,详细说明了更好的多字符音译,至少在原则上是这样。
猜你喜欢
  • 2011-06-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-15
  • 2016-02-03
  • 1970-01-01
  • 1970-01-01
  • 2015-07-02
相关资源
最近更新 更多