2

我有字符串"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

4

2 回答 2

6

我知道两种选择。

  1. transliterate来自I18n宝石。

    $ 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)
    

更新:

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

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

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

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

这可能会帮助您走得更远。请注意,自动检测到的编码可能不正确,如果您确切知道编码是什么,它将使一切变得容易得多。

于 2013-11-12T01:12:08.200 回答
3

你要做的就是所谓的音译

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

粗略的Google 搜索会产生一些 Ruby ICU 包装器。恐怕我无法评论哪个更好,因为我承认我从未使用过它们中的任何一个。但这就是您想要使用的那种东西。

于 2013-11-11T20:35:55.860 回答