0

我对 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 对象,一个是纯字符串,但是对于同一个字符,这两个十六进制代码之间的关系是什么?我将如何手动将一个转换为另一个?

4

2 回答 2

3

纯字符串已使用 UTF-8 进行编码,这是以字节表示 Unicode 代码点的多种方法之一。UTF-8 是一种多字节编码,它具有经常有用的特性,即它是 ASCII 的超集 - 相同的字节以 UTF-8 或 ASCII 编码任何 ASCII 字符。

在 Python 2.x 中,使用encodeUnicode 对象上的方法对其进行编码,decode或使用unicode构造函数对其进行解码:

>>> 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

于 2013-09-10T22:05:26.237 回答
0

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

转换以这种方式进行。

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

八进制转储产生

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

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

e288ab00

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

111000101000100010101011

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

0010001000101011

用十六进制重新表达

222B

他们你有!

于 2013-09-12T03:47:12.030 回答