Ruby,包编码(ASCII-8BIT,不能转换为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?

你这样做

的方式是错误的。如果您有如下所示的 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")

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

最新更新