ruby中的音译

在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 #=> # 2.0.0p0 :004 > UnicodeUtils.nfkd(r).gsub(/(\p{Letter})\p{Mark}+/,'\\1') #=> "Resume" 

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

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

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

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

请注意,您通常希望以标准格式标准化数据以进行比较,排序等。在ruby中,这里的两种格式“é”不等于()。 在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字母。

尝试从TechniConseils查看此脚本 , 该脚本替换字符串中的重音字符。 用法示例:

 "Gévry".removeaccents #=> Gevry