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?
的方式是错误的。如果您有如下所示的 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"
ASCII-8bit
是Ruby原生的假编码。它有一个别名 BINARY
,就是这样。 ASCII-8bit
不是字符编码,而是一种表示字符串是二进制数据而不是像文本那样处理的方式。由于pack
/unpack
函数旨在对二进制数据进行操作,因此您永远不应假设返回的内容在任何编码下都是可打印的,除非整个包字符串由字符派生组成。如果您明确总体目标是什么,也许我们可以为您提供更好的解决方案。
如果将十六
进制 UTF-8 代码隔离到变量中,请说code
十六进制格式的字符串减去百分号:
utf_char=[code.to_i(16)].pack("U")
将这些与字符串的其余部分结合起来,您可以制作字符串。