【问题标题】:Can I programmatically convert "I’d" to "I’d" using Ruby?我可以使用 Ruby 以编程方式将“I’d”转换为“I'd”吗?
【发布时间】:2015-03-10 00:02:03
【问题描述】:

我似乎找不到String#encode 恶作剧的正确组合。

【问题讨论】:

    标签: ruby encoding


    【解决方案1】:

    我希望您的脚本使用编码 cp1251 并且您的 ruby​​ >= 1.9。

    那么你可以使用force_encoding:

    #encoding: cp1251
    #works also with  encoding: binary
    source = 'I’d'
    puts source.force_encoding('utf-8') #-> I’d
    

    如果我的例外是错误的:您使用哪种编码以及哪个 ruby​​ 版本?


    一点背景: 编码问题很难分析。之间可能存在冲突:

    • 源代码的编码(由编辑器定义)。
    • 源代码的预期编码(在第一行用#encoding 定义)。这是 ruby​​ 使用的。
    • 字符串的编码(参见 http://nuclearsquid.com/writings/ruby-1-9-encodings/ 中的字符串编码部分)
    • 输出外壳的编码

    【讨论】:

    • @ArupRakshit 您的输出外壳是否支持 UTF-8?你的脚本代码真的是用 cp1251 编码的吗?
    • 我只是复制粘贴了你的代码并在我的 Vim 中运行.. 并得到了我上面所说的输出。
    • @ArupRakshit 你能在VIM中使用你的编码吗(见stackoverflow.com/questions/778069/…
    【解决方案2】:

    我想我对此感到困惑,所以我将在此处发布此内容,希望能帮助其他同样困惑的人。

    我试图在irb 会话中进行编码,这给了你

    irb(main):002:0> 'I’d'.force_encoding('UTF-8')
    => "I’d"
    

    如果你尝试使用encode 而不是force_encoding 那么你会得到

    irb(main):001:0> 'I’d'.encode('UTF-8')
    => "I’d"
    

    这是 irb 设置为使用 UTF-8 的输出和输入编码。在我的情况下,按照我想要的方式转换该字符串涉及告诉 Ruby 源字符串采用 windows-1252 编码。你可以通过使用 -E 参数来做到这一点,在该参数中指定 `inputencoding:outputencoding' 然后你会得到这个

    $ irb -EWindows-1252:UTF-8
    irb(main):001:0> 'I’d'
    => "I\xC3\xA2\xE2\x82\xAC\xE2\x84\xA2d"
    

    这看起来是错误的,除非你用管道输出它,这给出了这个

    $ ruby -E Windows-1252:UTF-8 -e "puts 'I’d'"
    I’d
    

    万岁。我不确定为什么 Ruby 将其显示为 "I\xC3\xA2\xE2\x82\xAC\xE2\x84\xA2d"(与终端的代码页有关?)所以如果有人可以进一步评论,那就太好了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-03
      • 2011-09-20
      • 2013-02-09
      • 2010-10-27
      • 1970-01-01
      相关资源
      最近更新 更多