红宝石中的音译

Sel*_*lva 10 ruby transliteration

在ruby中音译非英语字符的最简单方法是什么.那是转换,例如:

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

Gar*_*eth 10

Ruby 在其stdlib中有一个Iconv库,它以与常规iconv命令非常相似的方式转换编码

  • Iconv.iconv将被弃用,你如何使用String#encode进行音译? (8认同)
  • @jrdioko应该是`Iconv.iconv('ascii // translit // ignore','utf-8',string)` (2认同)

All*_*len 7

使用UnicodeUtils gem.这适用于1.9和2.0.Iconv已在这些版本中弃用.

gem install unicode_utils
Run Code Online (Sandbox Code Playgroud)

然后在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"
Run Code Online (Sandbox Code Playgroud)

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

首先,您必须使用NFKD(标准化表格(K)可扩展性分解)格式标准化字符串."é"unicode代码点,称为" 具有急性的拉丁文小写字母e ",可以用两种方式表示:

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

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

请注意,您通常希望以标准格式对数据进行标准化以进行比较,排序等.在ruby中,这里的两种格式"é"不等于().在IRB中,执行以下操作:

> "\u00e9"                   #=> "é"
> "\u0065\u0301"             #=> "e?"
> "\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é")  
                             #=> "Re?sume?"
> decomposed.chars.count     #=> 8
> decomposed.length          #=> 6
> decomposed.gsub(/(\p{Letter})\p{Mark}+/,'\\1')
                             #=> "Resume"
Run Code Online (Sandbox Code Playgroud)

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

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