将UTF-8字符转换为正确的ASCII字符

时间:2013-11-11 19:46:20

标签: ruby ascii

我有字符串"V\355ctor"(我认为是Víctor)。 有没有办法将其转换为ASCII,í将被ASCII i取代?

我已经尝试过Iconv但没有成功。 (我只得到Iconv::IllegalSequence: "\355ctor"

此外,Ruby 1.8.7和Ruby 2.0之间是否存在差异?

编辑: Iconv.iconv('UTF-8//IGNORE', 'UTF-8', "V\355ctor")这似乎有效,但结果是Vctor而非Victor

2 个答案:

答案 0 :(得分:5)

我知道两种选择。

    来自I18n gem的
  1. transliterate

    $ irb
    1.9.3-p448 :001 > string = "Víctor"
     => "Víctor" 
    1.9.3-p448 :002 > require 'i18n'
     => true 
    1.9.3-p448 :003 > I18n.transliterate(string)
     => "Victor"
    
  2. 来自stringex gem

    的Unidecoder
    Stringex::Unidecoder..decode(string)
    
  3. <强>更新

    在“V \ 355ctor”上运行Unidecoder时,会出现以下错误:

    Encoding::CompatibilityError: incompatible encoding regexp match (UTF-8 regexp with IBM437 string)
    

    嗯,也许你想先从IBM437翻译:

    string.force_encoding('IBM437').encode('UTF-8')
    

    这可以帮助您进一步发展。请注意,自动检测的编码可能不正确,如果您确切知道编码是什么,它会使一切变得更容易。

答案 1 :(得分:3)

您要做的是transliteration

最常用且维护得最好的库是ICU。 (Iconv也经常使用,但它有许多限制,例如你遇到的那个。)

粗略的Google search会产生一些红宝石ICU包装。我担心我无法评论哪一个更好,因为我承认从未使用过任何一个。但那就是你想要使用的那种东西。