八进制,十六进制,Unicode

时间:2016-05-09 17:00:16

标签: ruby unicode hex sip octal

我的线上出现一个字符,其中包含十六进制值和八进制值\xb1\261

这就是我的标题:

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

查看图片中的ASCII table字符为“±”:

enter image description here

我不明白:

  1. 如果我尝试通过在标题中传递“±Central Station”来测试相同内容,我会看到它转换为“\xC2\xB1”。为什么?
  2. 如何通过电汇而不是“\xB1”显示“\261”或“\xC2\xB1”。 即如果我尝试打印“\xB1”或“\261”,我从未看到“±”正在打印。但是如果我打印“\u00b1”它打印出所需的字符,我假设因为“\u00b1”是Unicode格式。

1 个答案:

答案 0 :(得分:3)

从您关联的页面:

  

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

     

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

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

假设您确定相关字符为±(可能但不保证),您的文字可以编码为ISO 8850-1,或者@muistooshort在评论中指出,还有许多其他ISO 8859-XCP-12XX (Windows-12XX)编码。但是,我们知道文本不是(有效)UTF-8,因为0xb1本身并不是有效的UTF-8字符。

如果您很幸运,无论客户发送此文本,都会在Content-Type header中指定编码。

关于你的问题:

  

1)如果我尝试通过在标题中传递±Central Station来测试相同内容,我会看到它转换为\xC2\xB1。为什么呢?

您传递的文字为UTF-8,UTF-8中代表±的字节为0xC2 0xB1

  

2)如何通过电话而不是\xB1出现\261\xC2\xB1

我们不知道你是如何测试的,所以我们无法回答这个问题。通常,但是:发送编码为ISO 8859-1(Ruby中为Encoding::ISO_8859_1)的文本,或原始文本所在的编码,或原始字节(Encoding::ASCII_8BITEncoding::BINARY ,它们是彼此的别名。)

  

2)如果我尝试打印\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来表示UTF-8字符,尽管我不喜欢#39;推荐后者,因为较少的Rubyist熟悉它。)

字符编码是一个很大的主题,远远超出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分钟,将来会为你节省数百小时的痛苦。