替换Ruby 1.9.3中的重音字符,不使用Rails

替换Ruby 1.9.3中的重音字符,不使用Rails,ruby,character-encoding,Ruby,Character Encoding,我想使用Ruby 1.9.3将重音UTF-8字符替换为ASCII等效字符。比如说, Acsády --> Acsady 传统的方法是使用IConv包,它是Ruby标准库的一部分。您可以这样做: str = 'Acsády' IConv.iconv('ascii//TRANSLIT', 'utf8', str) 这将产生 Acsa'dy 然后必须删除撇号。虽然这种方法在Ruby 1.9.3中仍然有效,但我收到一条警告,说IConv已被弃用,应该改用String#encode。但是,

我想使用Ruby 1.9.3将重音UTF-8字符替换为ASCII等效字符。比如说,

Acsády  -->  Acsady
传统的方法是使用IConv包,它是Ruby标准库的一部分。您可以这样做:

str = 'Acsády'
IConv.iconv('ascii//TRANSLIT', 'utf8', str)
这将产生

Acsa'dy
然后必须删除撇号。虽然这种方法在Ruby 1.9.3中仍然有效,但我收到一条警告,说
IConv已被弃用,应该改用String#encode
。但是,
String#encode
并没有提供完全相同的功能。默认情况下,未定义的字符会引发异常,但您可以通过设置:undef=>:replace(将未定义的字符替换为默认的“?”字符)或:fallback选项处理它们,该选项将未定义的源编码字符映射到目标编码。我想知道在标准库中或者通过一些gem是否有标准的:回退散列,这样我就不必编写自己的散列来处理所有可能的重音符号

@raina77ow:
谢谢你的回复。这正是我想要的。然而,在查看了您链接到的线程之后,我意识到更好的解决方案可能是简单地将非重音字符与其重音对应的字符进行匹配,就像数据库使用字符集排序规则一样。Ruby是否有与排序规则等价的东西?

我想您所寻找的与之类似。如果是,您可以使用为Ruby-like gem编写的Text::Unidecode端口(或者它的fork,看起来它已经准备好在1.9中使用了),例如。

我使用这个:

def convert_to_ascii(s)
  undefined = ''
  fallback = { 'À' => 'A', 'Á' => 'A', 'Â' => 'A', 'Ã' => 'A', 'Ä' => 'A',
               'Å' => 'A', 'Æ' => 'AE', 'Ç' => 'C', 'È' => 'E', 'É' => 'E',
               'Ê' => 'E', 'Ë' => 'E', 'Ì' => 'I', 'Í' => 'I', 'Î' => 'I',
               'Ï' => 'I', 'Ñ' => 'N', 'Ò' => 'O', 'Ó' => 'O', 'Ô' => 'O',
               'Õ' => 'O', 'Ö' => 'O', 'Ø' => 'O', 'Ù' => 'U', 'Ú' => 'U',
               'Û' => 'U', 'Ü' => 'U', 'Ý' => 'Y', 'à' => 'a', 'á' => 'a',
               'â' => 'a', 'ã' => 'a', 'ä' => 'a', 'å' => 'a', 'æ' => 'ae',
               'ç' => 'c', 'è' => 'e', 'é' => 'e', 'ê' => 'e', 'ë' => 'e',
               'ì' => 'i', 'í' => 'i', 'î' => 'i', 'ï' => 'i', 'ñ' => 'n',
               'ò' => 'o', 'ó' => 'o', 'ô' => 'o', 'õ' => 'o', 'ö' => 'o',
               'ø' => 'o', 'ù' => 'u', 'ú' => 'u', 'û' => 'u', 'ü' => 'u',
               'ý' => 'y', 'ÿ' => 'y' }
  s.encode('ASCII',
           fallback: lambda { |c| fallback.key?(c) ? fallback[c] : undefined })
end

你可以

这是哪种语言的口音?我所关心的口音来自一系列欧洲语言。我正在处理一组科学论文的作者。我怀疑这些gem使用了类似的散列。至少我可以清楚地看到,Text::Unidecode是基于字符表的。