Ruby,包编码(无法转换为UTF-8的ASCII-8BIT)

时间:2012-03-09 01:27:32

标签: ruby encoding utf-8

puts "C3A9".lines.to_a.pack('H*').encoding

结果

ASCII-8BIT

但我更喜欢UTF-8中的这个文字。但

"C3A9".lines.to_a.pack('H*').encode("UTF-8")

结果

`encode': "\xC3" from ASCII-8BIT to UTF-8 (Encoding::UndefinedConversionError)

为什么呢?如何将其转换为UTF-8?

2 个答案:

答案 0 :(得分:6)

你这是错误的方式。如果你有这样的URI编码数据:

%C5%BBaba

然后您应该使用URI.unescape对其进行解码:

1.9.2-head :004 > URI.unescape('%C5%BBaba')
 => "Żaba"

如果这不起作用,则强制编码为UTF-8:

1.9.2-head :004 > URI.unescape('%C5%BBaba').force_encoding('utf-8')
 => "Żaba"

答案 1 :(得分:4)

ASCII-8bit是Ruby的原始编码。它有BINARY的别名,就是这样。 ASCII-8bit不是字符编码,而是一种表示字符串是二进制数据而不是像文本一样处理的方式。由于pack / unpack函数旨在对二进制数据进行操作,因此除非ENTIRE包字符串由字符派生词组成,否则不应假设返回的内容在任何编码下都是可打印的。如果你澄清总体目标是什么,也许我们可以给你一个更好的解决方案。


如果将十六进制UTF-8代码隔离到变量中,请说code这是十六进制格式的字符串减去百分号:

utf_char=[code.to_i(16)].pack("U")

将这些与字符串的其余部分结合起来,就可以制作字符串了。