ruby - 蓝宝石英文 - 红宝石的音译




红宝石象征 (2)

在ruby中音译非英文字符的最简单方法是什么? 这是转换,如:

translit "Gévry"
#=> "Gevry"


Ruby在其stdlib中有一个Iconv库,它可以以类似于通常的iconv命令的方式转换编码


使用UnicodeUtils gem。 这工作在1.9和2.0。 Iconv在这些版本中已被弃用。

gem install unicode_utils

然后在IRB中试试这个:

2.0.0p0 :001 > require 'unicode_utils'  #=> true
2.0.0p0 :002 > r = "Résumé"             #=> "Résumé"
2.0.0p0 :003 > r.encoding               #=> #<Encoding:UTF-8>
2.0.0p0 :004 > UnicodeUtils.nfkd(r).gsub(/(\p{Letter})\p{Mark}+/,'\\1')
                                        #=> "Resume"

现在解释这是如何工作的!

首先,你必须在NFKD (Normalization Form(K)ompatability Decomposition)格式中规范化字符串。 “é”unicode codepoint,被称为“ 带有尖锐的拉丁字母e ”,可以用两种方式表示:

  • é= U + 00E9
  • é=(e = U + 0065)+(急= U + 0301)

第一种形式是最受欢迎的单一代码点。 第二种形式是分解格式,将字形(在屏幕上显示为“é”)分隔为两个基本代码点,ASCII“e”和尖锐的重音符号。 Unicode可以从许多代码点组成一个字形,这在一些亚洲书写系统中是有用的。

请注意,您通常希望以标准格式对数据进行规范化处理,以进行比较,排序等。在红宝石中,“é”这两种格式不等于()。 在IRB中,执行此操作:

> "\u00e9"                   #=> "é"
> "\u0065\u0301"             #=> "é"
> "\u00e9" == "\u0065\u0301" #=> false
> "\u00e9" > "\u0065\u0301"  #=> true
> "\u00e9" >= "f"            #=> true  (composed é > f)
> "\u0065\u0301" > "f"       #=> false (decomposed é < f)

> "Résumé".chars.count       #=> 6
> decomposed = UnicodeUtils.nfkd("Résumé")  
                             #=> "Résumé"
> decomposed.chars.count     #=> 8
> decomposed.length          #=> 6
> decomposed.gsub(/(\p{Letter})\p{Mark}+/,'\\1')
                             #=> "Resume"

现在我们有了NFKD格式的字符串,我们可以使用“属性名称”语法(\ p {property_name})应用一个正则表达式来匹配一个字母后跟一个或多个变音符号“标记”。 通过捕获匹配的字母,我们可以使用gsub来替换整个字符串中被捕获的字母的字母+变音符号。

这种技术从ASCII字母中删除了变音符号,并且不会将诸如希腊语或西里尔字符串等字符集音译为等效的ASCII字母。





transliteration