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