【问题标题】:Converting UTF-8 characters into properly ASCII characters将 UTF-8 字符转换为正确的 ASCII 字符
【发布时间】:2013-11-11 19:46:20
【问题描述】:

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

【问题讨论】:

  • 你需要走多远?您是只想去掉重音符号,还是也想将土耳其语的 ı 转换为简单的 i
  • 后者。我不想“忽略”这个字符,而是用一个简单的i 替换它
  • 您输入的不是UTF-8,很可能是ISO-8859-1。并不是说这是您需要的答案,但是如果您从对输入字符串编码的错误假设开始,您将无法获得合理的转换。正确的 ASCII 翻译需要正确
  • @NeilSlater 说了什么。值八进制 355/十进制 237 后跟“c”的字节在 UTF-8 中是不合法的,其中“í”字符被编码为两个字节:八进制 303/十进制 195 后面跟着八进制 255/十进制 173。
  • 谢谢 Neil 和 Mark,但是像 Iconv.iconv("ISO-8859-1", "ASCII", "V\355ctor") 这样的东西对我来说会引发 Iconv::IllegalSequence 错误(我已经尝试了很多组合)。

标签: ruby ascii


【解决方案1】:

我知道两种选择。

  1. transliterate 来自 I18n gem。

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

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

【讨论】:

【解决方案2】:

你想做的事叫transliteration

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

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

【讨论】:

    猜你喜欢
    • 2011-06-19
    • 1970-01-01
    • 1970-01-01
    • 2015-08-06
    • 1970-01-01
    • 2021-12-31
    • 1970-01-01
    • 1970-01-01
    • 2012-09-22
    相关资源
    最近更新 更多