【发布时间】:2013-09-10 21:54:35
【问题描述】:
我对 Unicode 的十六进制表示感到困惑。 我有一个示例文件,其中包含一个数学积分符号字符。即U+222B 如果我 cat 文件或在 vi 中编辑它,我会显示一个积分符号。 该文件的十六进制转储显示其十六进制内容为 88e2 0aab
在 python 中,我可以创建一个完整的 unicode 字符并在我的终端上打印 p 渲染和整数符号。
>>> p=u'\u222b'
>>> p
u'\u222b'
>>> print p
∫
让我困惑的是我可以打开一个带有积分符号的文件,得到积分符号但十六进制内容不同。
>>> c=open('mycharfile','r').read()
>>> c
'\xe2\x88\xab\n'
>>> print c
∫
一个是 Unicode 对象,一个是纯字符串,但是对于同一个字符,这两个十六进制代码之间的关系是什么?我如何手动将一个转换为另一个?
【问题讨论】:
-
0x222b= 8747 是代码点的整数,在 Unicode 中,与整数符号∫相关联。当您将文本写入文件或通过网络发送时,它必须始终序列化为位——通常,八位字节(字节)是这里的首选单位。系列0xe2,0x88,0xab(或0b11100010,0b10001000,0b10101011二进制)是0x222b的UTF-8编码(en.wikipedia.org/wiki/UTF-8)。顺便说一句,第一个字节中的三个前导1s 告诉您这个代码点是用三个字节编码的:UTF-8 既是可变宽度又是“同步”的。 -
bitly 链接看起来很有希望。还应该指出,Py3 中的 Unicode 处理比以前在 Py2 中要明智得多——以至于在决定使用哪个 Python 版本时,这一因素应该很重要。可悲的是,Py2 和 Py3 之间存在着不好的和持续的分裂,第三方库支持滞后。 Py3 的亮点在于旧的“ASCII 字符串”已经不复存在;您总是处理字节缓冲区(编码)或(Unicode)文本(解码)。它只是改变了概念/命名事物,但是编程很多关于概念和命名事物。
-
除了概念和名称的改变之外,Py3 还具有不隐式转换字节和字符串的更安全的行为。尝试将它们连接起来,它会立即抱怨,这比 Py2 方法要好得多,它通常可以工作,但在默认编码无法转换时会失败。
-
我仍然缺少一些东西。字节对从字符的十六进制编辑中包含的 88e2 0aab 反转,一个字符是返回,所以我们剩下 0xe2、0x88、0xab
标签: python unicode unicode-string