【问题标题】:Octal, Hex, Unicode八进制、十六进制、Unicode
【发布时间】:2016-09-04 10:10:39
【问题描述】:

我有一个字符出现在电线上,它具有十六进制值和八进制值\xb1 和\261。

这是我的标题的样子:

From: "\261Central Station <sip@...>"

看ASCII table图中的字符是“±”:

我不明白的:

  1. 如果我尝试通过在标题中传递“±Central Station”来测试它,我会看到它转换为“\xC2\xB1”。为什么?
  2. 如何让“\xB1”或“\261”出现在电线上而不是“\xC2\xB1”。 e.如果我尝试打印“\xB1”或“\261”,我永远不会看到“±”被打印出来。但是如果我打印“\u00b1”它会打印所需的字符,我假设因为“\u00b1”是 Unicode 格式。

【问题讨论】:

标签: ruby unicode hex sip octal


【解决方案1】:

从您链接到的页面:

扩展ASCII码(字符码128-255)

8 位 ASCII 表有几种不同的变体。下表根据 ISO 8859-1,也称为 ISO Latin-1。

这值得读两遍。字符代码 128–255 不是 ASCII(ASCII 是 7 位编码,以 127 结尾)。

假设你是正确的,有问题的字符是±(很可能,但不能保证),你的文本可以编码为 ISO 8850-1,或者正如@muistooshort 在 cmets 中指出的那样,任何许多其他ISO 8859-X 或CP-12XX (Windows-12XX) 编码。但是,我们确实知道该文本不是(有效的)UTF-8,因为 0xb1 本身不是有效的 UTF-8 字符。

如果幸运的话,无论发送此文本的客户端都在Content-Type header 中指定了编码。

关于你的问题:

  1. 如果我尝试通过在标头中传递±Central Station 来测试它,我看到它被转换为\xC2\xB1。为什么?

您传递的文本是 UTF-8 格式,而在 UTF-8 格式中表示 ± 的字节是 0xC2 0xB1。

  1. 如何让\xB1 或\261 出现在网络上而不是\xC2\xB1?

我们不知道您是如何测试这个的,所以我们无法回答这个问题。不过,一般来说:要么发送编码为 ISO 8859-1 的文本(Ruby 中的 Encoding::ISO_8859_1),要么发送原始文本的任何编码,或者作为原始字节(Encoding::ASCII_8BIT 或 Encoding::BINARY,它们是每个其他)。

  1. 如果我尝试打印\xB1 或\261,我永远不会看到± 被打印。但是如果我打印 \u00b1 它会打印所需的字符。 (我假设是因为 \u00b1 是 unicode 格式,但如果有人能详细解释这一点,我会喜欢的。)

这不是问题,但原因是 \xB1 (\261) 不是有效的 UTF-8 字符。部分界面会打印�为无效字符;其他人会简单地忽略它们。另一方面,\u00b1 是一个有效的 Unicode 代码点,Ruby 知道如何用 UTF-8 表示。

简而言之:UTF-8(如 UTF-16 和 UTF-32)是 Unicode 标准指定的字符编码。 U+00B1 是 ± 的 Unicode 代码点,0xC2 0xB1 是在 UTF-8 中表示该代码点的字节。在 Ruby 中,我们可以使用 Unicode 代码点 (\u00b1) 或 UTF-8 字节(十六进制:\xC2\xB1;或八进制:\302\261,尽管我不推荐后者,因为熟悉它的 Ruby 爱好者较少)。

字符编码是一个很大的话题,远远超出了 Stack Overflow 答案的范围。要获得好的入门知识,请阅读 Joel Spolsky 的 "The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)",有关字符编码如何在 Ruby 中工作的更多详细信息,请阅读 Yehuda Katz 的 "Encodings, Unabridged"。阅读这两者将花费您不到 30 分钟的时间,并将为您节省数百小时的痛苦。

【讨论】:

  • “字符编码是个大话题”。男孩,那肯定是真的。当他们认为 ASCII 不够用时,他们打开了一罐蠕虫病毒。 :-)
  • \xb1 的存在并不一定意味着它是 Latin-1。大多数 ISO-8859-X(除了 -6 AFAIK)编码都使用\xb1,就像 Windows 中的各种 CP-12XX 编码一样。您需要更多数据和一些上下文来猜测编码。
  • 不用担心,字符编码是一个大杂烩,有很多标准可供选择。至少我们现在几乎都支持 UTF-8。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-08-21
  • 2015-12-12
  • 2014-03-11
  • 2012-12-12
  • 2019-04-29
  • 1970-01-01
相关资源
最近更新 更多