【发布时间】:2015-03-10 00:02:03
【问题描述】:
我似乎找不到String#encode 恶作剧的正确组合。
【问题讨论】:
我似乎找不到String#encode 恶作剧的正确组合。
【问题讨论】:
我希望您的脚本使用编码 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 使用的。【讨论】:
我想我对此感到困惑,所以我将在此处发布此内容,希望能帮助其他同样困惑的人。
我试图在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"(与终端的代码页有关?)所以如果有人可以进一步评论,那就太好了。
【讨论】: