1

假设我想转换"\xBD"为 UTF-8。

如果我使用pack& unpack,我会得到½

puts "\xBD".unpack('C*').pack('U*')    #=> ½

与ISO-8859-1 中的"\xBD"一样。½

但是"\xBD"œISO-8859-9 中。

我的问题是:为什么pack使用 ISO-8859-1 而不是 ISO-8859-9 将 char 转换为 UTF-8?有没有办法配置那个字符编码?

我知道我可以Iconv在 Ruby 1.8.7 和String#encode1.9.2 中使用,但我很好奇,pack因为我在某些代码中使用了它。

4

1 回答 1

4

\xBD这实际上与ISO-8859-x 中的表示方式无关。关键部分是pack转入 UTF-8。

pack收到[189]。_ 代码点 189 在 UTF-8(更准确地说,Unicode)中定义为½. 不要认为这是 Unicode 规范编写者“优先” ISO-8859-1 而不是 ISO-8859-9。他们必须选择代表什么代码点½,他们只选择了 189。

由于您想了解更多关于pack/的信息unpack,让我解释一下:

当您unpack使用该C指令时,ruby 将字符串解释为 ascii-8bit,并提取 ascii 代码。在这种情况下\xBD转换为0xBDaka 189。这是一个非常基本的转换。

当您pack使用该U指令时,ruby 将在其 UTF-8 转换表中查找,以查看哪些代码点映射到数组中的每个整数。

pack/unpack具有非常具体的行为,具体取决于您提供的指令。我建议阅读 ruby​​-doc.org。有些指令对我来说仍然没有意义,所以不要气馁。

于 2012-07-12T18:54:19.190 回答