我的线上出现一个字符,其中包含十六进制值和八进制值\xb1
和\261
。
这就是我的标题:
From: "\261Central Station <sip@...>"
查看图片中的ASCII table字符为“±
”:
我不明白:
±Central Station
”来测试相同内容,我会看到它转换为“\xC2\xB1
”。为什么?\xB1
”显示“\261
”或“\xC2\xB1
”。
即如果我尝试打印“\xB1
”或“\261
”,我从未看到“±
”正在打印。但是如果我打印“\u00b1
”它打印出所需的字符,我假设因为“\u00b1
”是Unicode格式。答案 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-X或CP-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_8BIT
或Encoding::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分钟,将来会为你节省数百小时的痛苦。