字节串与unicode字符串。蟒蛇

时间:2012-04-08 04:37:10

标签: python string unicode

你能否详细解释Python中字节字符串和Unicode字符串之间的区别。我看过this

  

字节代码只是将转换后的源代码转换为字节数组

这是否意味着Python有自己的编码/编码格式?或者它是否使用操作系统设置? 我不明白。你能解释一下吗? 谢谢!

2 个答案:

答案 0 :(得分:36)

没有python不使用自己的编码。它将使用它有权访问的任何编码以及您指定的编码。 str中的字符代表一个unicode字符。但是,为了表示超过256个字符,单个unicode编码每个字符使用多个字节来表示许多字符。 bytearray个对象使您可以访问底层字节。 str个对象具有encode方法,该方法接受表示编码的字符串,并返回表示该编码中的字符串的bytearray对象。 bytearray个对象具有decode方法,该方法接受表示编码的字符串,并返回将str解释为在给定编码中编码的字符串而产生的bytearray。这是一个例子。

>>> a = "αά".encode('utf-8')
>>> a
b'\xce\xb1\xce\xac'
>>> a.decode('utf-8')
'αά'

我们可以看到UTF-8使用四个字节,\ xce,\ xb1,\ xce和\ xac来表示两个字符。在Ignacio Vazquez-Abrams提到的Spolsky文章之后,我会阅读Python Unicode Howto

答案 1 :(得分:27)

这里尝试的是一个仅适用于Python 3的简单解释。我希望来自一个外行人,这将有助于为完全不知情的人清除一些混乱。如果有任何技术上的不准确之处,请原谅我并随意指出。

假设您以通常的方式使用Python 3创建一个字符串:

stringobject = 'ant'

stringobject将是一个unicode字符串。

unicode字符串由unicode字符组成。在上面的stringobject中,unicode字符是单个字母,例如a,n,t

每个unicode字符都分配了一个代码点,可以表示为十六进制数字序列(十六进制数字可以取16个值,范围从0-9到A-F)。例如,字母'a'相当于'\u0091',' ant'相当于'\u0061\u006E\u0074'

所以你会发现,如果你输入,

stringobject = '\u0061\u006E\u0074'
stringobject

您还将获得输出'ant'

现在, unicode转换为字节,在称为编码的过程中。 将字节转换为unicode 的相反过程称为解码

这是怎么做到的?由于每个十六进制数字可以取16个不同的值,因此它可以以4位二进制序列反映(例如,十六进制数字0可以二进制表示为0000,十六进制数字1可以表示为0001等等)。如果一个unicode字符的代码点由四个十六进制数字组成,则需要一个16位二进制序列来对其进行编码。

不同的编码系统指定将unicode转换为位的不同规则。最重要的是,编码在用于表示每个unicode字符的位数方面不同。

例如,ASCII编码系统每个字符仅使用8位(1字节)。因此,它只能编码具有长达两个十六进制数字的代码点的unicode字符(即256个不同的unicode字符)。 UTF-8编码系统每个字符使用8到32位(1到4个字节),因此它可以编码具有长达8个十六进制数字的代码点的unicode字符,即所有内容。

运行以下代码:

byteobject = stringobject.encode('utf-8')
byteobject, type(byteobject)

使用utf-8编码系统将unicode字符串转换为字节字符串,并返回b'ant', bytes'

请注意,如果您使用了' ASCII'作为编码系统,你不会遇到任何问题,因为所有代码都指向了' ant'可以用1个字节表示。但是如果你有一个包含代码点长度超过两位十六进制数字的字符的unicode字符串,那么你将获得UnicodeEncodeError

同样,

stringobject = byteobject.decode('utf-8')
stringobject, type(stringobject)

为您提供'ant', str