我正在尝试将一个字符串从ISO-8859-1编码转换为UTF-8,但似乎无法使其正常工作。以下是我在irb中所做的示例。
irb(main):050:0> string = 'Norrlandsvägen'
=> "Norrlandsvägen"
irb(main):051:0> string.force_encoding('iso-8859-1')
=> "Norrlandsv\xC3\xA4gen"
irb(main):052:0> string = string.encode('utf-8')
=> "Norrlandsvägen"
我不确定为什么iso-8859-1格式中的Norrlandsvägen会被转换成utf-8格式中的Norrlandsvägen。
我尝试了encode、encode!、encode(destinationEncoding, originalEncoding)、iconv、force_encoding以及各种奇怪的方法,但似乎都没有用。请问有人能帮我或指点一下方向吗?
Ruby新手仍然疯狂地抓头,但感谢这里所有人的回复……:)
问题背景:我正在编写一个gem,将从某些网站下载xml文件(其编码为iso-8859-1),并将其保存在存储中,我想先将其转换为utf-8格式。但像Norrlandsvägen这样的单词总是让我犯难。真的非常感谢任何帮助!
[更新]: 我意识到在irb控制台中运行此类测试可能会给我带来不同的行为,所以这是我在实际代码中拥有的内容:
def convert_encoding(string, originalEncoding)
puts "#{string.encoding}" # ASCII-8BIT
string.encode(originalEncoding)
puts "#{string.encoding}" # still ASCII-8BIT
string.encode!('utf-8')
end
但是最后一行会出现以下错误:
Encoding::UndefinedConversionError - "\xC3" from ASCII-8BIT to UTF-8
感谢@Amadan在下面的回答中提供的帮助,我注意到如果你运行以下命令,
\xC3
实际上会出现在irb中:irb(main):001:0> string = 'ä'
=> "ä"
irb(main):002:0> string.force_encoding('iso-8859-1')
=> "\xC3\xA4"
我也尝试将新变量分配给string.encode(originalEncoding)
的结果,但是得到了一个更奇怪的错误:
newString = string.encode(originalEncoding)
puts "#{newString.encoding}" # can't even get to this line...
newString.encode!('utf-8')
错误信息为Encoding::UndefinedConversionError - "\xC3" to UTF-8 in conversion from ASCII-8BIT to UTF-8 to ISO-8859-1
在所有这些编码混乱中,我仍然感到很困惑,但我非常感谢大家给我的回复和帮助!非常感谢! :)