python基础(字节)

 Unicode、bytes和bytearray

Python字符串使用Unicode编码来表示文本。

大致而言,每个Unicode字符都用一个码点(code point)表示,而码点是Unicode标准给每个字符指定的数字。

使用16或32位的十六进制字面量(分别加上前缀\u或\U)或者使用字符的Unicode名称
(\N{name})。
>>> "\u00C6" 
'Æ' 
>>> "\U0001F60A" 
'☺ '
获悉字符的Unicode码点和名称,可参阅特定的网站,如http://unicode-table.com。
在内存和磁盘中,所有对象都是以二进制数字(0和1)表示的(这些数字每8个为一组,即1字节),字符串也不例外。在诸如C等编程语言中,这些字节完全暴露,而字符串不过是字节序列而已。为与C语言互操作以及将文本写入文件或通过网络套接字发送出去,Python提供了两种类似的类型:不可变的bytes和可变的bytearray。如果需要,可直接创建bytes对象(而不是字符串),方法是使用前缀b:
>>> b'Hello, world!' 
b'Hello, world!

然而,1字节只能表示256个不同的值,离Unicode标准的要求差很远。Python bytes字面量只支持ASCII标准中的128个字符,而余下的128个值必须用转义序列表示,如\xf0表示十六进制值0xf0(即240)。

唯一的差别好像在于可用的字母表规模,但实际上并非完全如此。ASCII和Unicode定义的都是非负整数和字符之间的映射,但存在细微的差别:Unicode码点是使用整数定义的,而ASCII字符是使用对应的数及其二进制编码定义的。

具体地说,进行单字节编码时,依然使用ASCII编码,以便与较旧的系统兼容;但对于不在这个范围内的字符,使用多个字节(最多为6个)进行编码。下面来使用ASCII、UTF-8和UTF-32编码将字符串转换为bytes。
>>> "Hello, world!".encode("ASCII") 
b'Hello, world!' 
>>> "Hello, world!".encode("UTF-8") 
b'Hello, world!' 
>>> "Hello, world!".encode("UTF-32") 
b'\xff\xfe\x00\x00H\x00\x00\x00e\x00\x00\x00l\x00\x00\x00l\x00\x00\x00o\x00\x00\x00,\x00\ 
x00\x00 \x00\x00\x00w\x00\x00\x00o\x00\x00\x00r\x00\x00\x00l\x00\x00\x00d\x00\x00\x00!\x00\ 
x00\x00'
从中可知,使用前两种编码的结果相同,但使用最后一种编码的结果长得多。再来看一个
示例:
>>> len("How long is this?".encode("UTF-8")) 
17 
>>> len("How long is this?".encode("UTF-32")) 
72
只要字符串包含较怪异的字符,ASCII和UTF-8之间的差别便显现出来了:
>>> "Hællå, wørld!".encode("ASCII") 
Traceback (most recent call last): 
 ... 
UnicodeEncodeError: 'ascii' codec can't encode character '\xe6' in position 1: ordinal not in range(128)

与前面一样,默认编码也是UTF-8。你可指定其他编码,但如果指定的编码不正确,将出现错误消息或得到一堆乱码。bytes对象本身并不知道使用的是哪种编码,因此你必须负责跟踪这一点。可不使用方法encode和decode,而直接创建bytes和str(即字符串)对象,如下所示:
>>> bytes("Hællå, wørld!", encoding="utf-8") 
b'H\xc3\xa6ll\xc3\xa5, w\xc3\xb8rld!' 
>>> str(b'H\xc3\xa6ll\xc3\xa5, w\xc3\xb8rld!', encoding="utf-8") 
'Hællå, wørld!'

这种方法更通用一些,在你不知道类似于字符串或bytes的对象属于哪个类时,使用这种方法也更管用。一个通用规则是,不要做过于严格的假设。
编码和解码的最重要用途之一是,将文本存储到磁盘文件中。只要文件使用的是UTF-8编码,就无需操心编码和解码的问题。但如果原本正常的文本变成了乱码,就说明文件使用的可能是其他编码。

源代码也将被编码,且默认使用的也是UTF-8编码。如果你想使用其他编码(例如,如果你使用的文本编辑器使用其他编码来存储源代码),可使用特殊的注释来指定。
# -*- coding: encoding name -*- 
请将其中的encoding name替换为你要使用的编码(大小写都行),如utf-8或latin-1。

bytearray

最后,Python还提供了bytearray,它是bytes的可变版。从某种意义上说,它就像是可修改的字符串——常规字符串是不能修改的。然而,bytearray其实是为在幕后使用而设计的,因此作为类字符串使用时对用户并不友好。例如,要替换其中的字符,必须将其指定为0~255的值。因此,要插入字符,必须使用ord获取其序数值(ordinal value)。
>>> x = bytearray(b"Hello!") 
>>> x[1] = ord(b"u") 
>>> x 
bytearray(b'Hullo!')

ASCII码

ord()英文字母转换ASCII码数字

chr()数字转换ASCII码英文字母

猜你喜欢

转载自blog.csdn.net/jamfiy/article/details/87874135