字节串与unicode字符串.蟒蛇

ash*_*him 38 python string unicode

你能详细解释Python中字节字符串和Unicode字符串之间的区别吗?我读过这个:

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

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

aar*_*ing 36

没有python不使用自己的编码.它将使用它有权访问的任何编码以及您指定的编码.a中的字符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')
'??'
Run Code Online (Sandbox Code Playgroud)

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

  • 您可能应该提到此代码适用于Python 3. (19认同)
  • 你的意思是`bytes`对象,没有`bytearray`:实际上,`type("é".encode('UTF-8'))`是`bytes`,而不是`bytearray`. (3认同)
  • 这件事真是让人费解。我从来没有真正理解 Python 字符串 (2认同)

run*_*kid 30

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

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

stringobject = 'ant'
Run Code Online (Sandbox Code Playgroud)

stringobject 将是一个unicode字符串.

unicode字符串由unicode字符组成.在stringobject上文中,unicode字符是单独的字母,例如a,n,t

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

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

stringobject = '\u0061\u006E\u0074'
stringobject
Run Code Online (Sandbox Code Playgroud)

您还将获得输出'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个字节),因此它可以编码unicode字符,代码点长达8个十六进制数字,即所有内容.

运行以下代码:

byteobject = stringobject.encode('utf-8')
byteobject, type(byteobject)
Run Code Online (Sandbox Code Playgroud)

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

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

同样的,

stringobject = byteobject.decode('utf-8')
stringobject, type(stringobject)
Run Code Online (Sandbox Code Playgroud)

给你'ant', str.

  • (1) 一般来说,用户感知的字符(例如“g̈”)可能对应于多个 Unicode 代码点(在本例中为 U+0067 U+0308)。(2) Unicode 代码点的编码可能与它的数量无关,即 8 位编码可以表示 ~0x100 个字符,所有这些字符不必*连续*(不需要 *"a 代码由四个十六进制数字组成的点,需要一个 16 位二进制序列来对其进行编码“* - 谈论编码单个代码点所需的大小是没有意义的 - 只有一组字符施加限制) (2认同)