这是否意味着Python有自己的编码格式?还是它使用操作系统设置?我不理解,请你解释一下,谢谢!字节码只是将源代码转换为字节数组
这是否意味着Python有自己的编码格式?还是它使用操作系统设置?我不理解,请你解释一下,谢谢!字节码只是将源代码转换为字节数组
不,Python没有使用自己的编码方式 - 它将使用任何它可以访问和你指定的编码方式。
str
中的一个字符代表一个Unicode字符。然而,为了表示超过256个字符,单个Unicode编码需要用多于一个字节的字符来表示许多字符。
bytes
对象让你访问底层字节。str
对象有一个encode
方法,它接受一个字符串表示的编码方式,并返回代表该编码方式下该字符串的bytes
对象。 bytes
对象有一个decode
方法,它接受一个字符串表示的编码方式,并返回解释该byte
作为以给定编码方式编码的字符串所得到的str
。
例如:
>>> a = "αά".encode('utf-8')
>>> a
b'\xce\xb1\xce\xac'
>>> a.decode('utf-8')
'αά'
我们可以看到UTF-8使用四个字节,\xce
、\xb1
、\xce
和\xac
来表示两个字符。Python Unicode Howto(官方文档)
关于Unicode和字符集每个软件开发者都必须绝对知道的最低限度(别找借口!)作者Joel Spolsky
实用的Unicode作者Ned Batchelder
这里是一份简单易懂的Python 3解释尝试。希望来自普通人的解释能够帮助完全不熟悉的人消除一些困惑。如有任何技术上的错误,请谅解并随时指出。
假设您按照通常的方式在Python 3中创建了一个字符串:
stringobject = 'ant'
stringobject
是一个Unicode字符串。
Unicode字符串由Unicode字符组成。在上面的 stringobject
中,Unicode字符是单个字母,例如a、n、t。
每个Unicode字符都被分配一个代码点,可以表示为十六进制数字序列(十六进制数字可以取16个值,范围从0-9和A-F)。例如,字母'a'
等同于'\u0061'
,而'ant'等同于'\u0061\u006E\u0074'
。
因此,您会发现如果输入:
stringobject = '\u0061\u006E\u0074'
stringobject
'ant'
。byteobject = stringobject.encode('utf-8')
byteobject, type(byteobject)
将Unicode字符串使用UTF-8编码系统转换为字节串,并返回b'ant', bytes'
。
请注意,如果您使用“ASCII”作为编码系统,您不会遇到任何问题,因为“ant”中的所有代码点都可以用1个字节表示。但是,如果您有一个包含比两个十六进制数字更长的代码点的Unicode字符串,您将会得到一个UnicodeEncodeError
。
同样地,
stringobject = byteobject.decode('utf-8')
stringobject, type(stringobject)
这个函数给你'ant', str
。
g̈
可能对应于多个 Unicode 码点(在这种情况下为 U+0067 U+0308)。
(2) Unicode 码点的编码可能与其编号无关,即 8 位编码可以表示约 0x100 个字符,不必要求所有这些字符都必须是连续的(一个由四个十六进制数字组成的码点需要一个 16 位二进制序列来编码它并不合理——只有一组字符会施加限制)。 - jfschr(128).encode('ascii')
,你会得到一个编码错误。 - PM 2Ring