Sel*_*lva 10 ruby transliteration
在ruby中音译非英语字符的最简单方法是什么.那是转换,例如:
translit "Gévry"
#=> "Gevry"
使用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 ",可以用两种方式表示:
第一种形式是最受欢迎的单一代码点.第二种形式是分解格式,将字形(在屏幕上显示为"é")分成两个基本代码点,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字母.