对unicode表示感到困惑

时间:2013-09-10 21:54:36

标签: python unicode unicode-string

我对Unicode的十六进制表示感到困惑。 我有一个示例文件,其中包含一个数学积分符号字符。那是U + 222B 如果我捕获文件或在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对象,一个是纯字符串但是两个十六进制代码之间的关系显然是针对同一个字符的?我如何手动将一个转换为另一个?

2 个答案:

答案 0 :(得分:3)

普通字符串已使用UTF-8编码,UTF-8是以字节为单位表示Unicode代码点的各种方法之一。 UTF-8是一种多字节编码,它具有通常有用的功能,它是ASCII的超集 - 相同的字节编码UTF-8或ASCII中的任何ASCII字符。

在Python 2.x中,使用Unicode对象上的encode方法对其进行编码,使用decodeunicode构造函数对其进行解码:

>>> u'\u222b'.encode('utf8')
'\xe2\x88\xab'
>>> '\xe2\x88\xab'.decode('utf8')
u'\u222b'
>>> unicode('\xe2\x88\xab', 'utf8')
u'\u222b'

print,当给出Unicode参数时,会对其进行隐式编码。在我的系统上:

>>> sys.stdout.encoding
'UTF-8'

有关print行为的详细讨论,请参阅此答案: Why does Python print unicode characters when the default encoding is ASCII?

Python 3处理的事情有点不同;这些变化记录在这里: http://docs.python.org/3.0/whatsnew/3.0.html#text-vs-data-instead-of-unicode-vs-8-bit

答案 1 :(得分:0)

好的,我有。谢谢你的回答。我想看看如何进行转换,而不是使用Python转换字符串。

转换就是这样。

如果你有一个unicode字符,在我的例子中是一个整数符号。

Octal dump产生

echo -n "∫"|od -x
0000000 88e2 00ab

每个十六进制对都是反转的,所以它的确意味着

e288ab00

第一个十六进制字符是E.高位表示这是一个Unicode字符串,接下来的两位表示它是3个三字节(16位)来表示字符。 其余十六进制数字的前两位被丢弃(它们表示它们是unicode。)完整的比特流是

111000101000100010101011

丢弃剩余十六进制数字的前4位和前两位

0010001000101011

以十六进制重新表达

222B

他们你拥有它!