一. 前言
再一次学起了Python,看的依旧是廖雪峰老师的Python教程,依旧是看到字符编码这里,一头雾水,于是根据廖雪峰老师的字符串和编码一文,整理出这样的一个笔记,希望以后复习的时候能轻松一些~
二. 编码的演变
-
ASCII编码只能表示127个字符被,也就是大小写英文字母、数字和一些符号,于是为了表示中文和其他各种国家的文字,Unicode应运而生。
-
为了节约空间,又将Unicode编码转化为“可变长编码”:UTF-8编码应运而生
三. 编码的联系和区别
-
而ASCII编码实际上可以被看成是UTF-8编码的一部分
-
在计算机内存中,统一使用Unicode编码,当需要保存到硬盘或者需要传输的时候,就转换为UTF-8编码
-
ASCII编码是1个字节,而Unicode编码通常是2个字节。UTF-8则将常用的英文字母被编码成1个字节,汉字通常是3个字节。
四. Python字符串
操作字符串的几个常用Python函数:
print(ord('A')) # ord()函数获取字符的整数表示, print(chr(30002)) # chr()函数把编码转换为对应的字符 print('\u4e2d\u6587') # 根据字符的整数编码,输出字符 输出 : 65 甲 中文
最新的Python 3版本中,字符串在内存中以Unicode表示,通过encode()方法可以编码为指定的bytes
print('ABC'.encode('ascii')) # 输出b'ABC' # Python对bytes类型的数据用带b前缀的单引号或双引号表示 # 要注意区分'ABC'和b'ABC',前者是str,后者虽然内容显示得和前者一样 # 但bytes的每个字符都只占用一个字节 print('ABC'.encode('utf-8')) # 输出b'ABC' print('甲'.encode('utf-8')) # 输出b'\xe7\x94\xb2'
反过来,如果我们从网络或磁盘上读取了字节流,那么读到的数据就是bytes。要把bytes变为str,就需要用decode()方法:
print( b'ABC'.decode('ascii')) # 输出:ABC print(b'\xe7\x94\xb2'.decode('utf-8')) # 输出:甲
len()函数计算的是str的字符数,如果换成bytes,len()函数就计算字节数:
print(len('AB C')) # 输出:5 print(len(b'AB C')) # 输出:5 print(len('甲')) # 输出:1 print(len('甲'.encode('utf-8'))) # 输出:3 #1个中文字符经过UTF-8编码后通常会占用3个字节,而1个英文字符依旧只占用1个字节
在操作字符串时,我们经常遇到str和bytes的互相转换。为了避免乱码问题,应当始终坚持使用UTF-8编码对str和bytes进行转换。
由于Python源代码也是一个文本文件,所以,当你的源代码中包含中文的时候,在保存源代码时,就需要务必指定保存为UTF-8编码。当Python解释器读取源代码时,为了让它按UTF-8编码读取,我们通常在文件开头写上这两行:
#!/usr/bin/env python3 # -*- coding: utf-8 -*-
五. 格式化字符串
在Python中,采用的格式化方式和C语言是一致的,用%实现,常用方法如下:
print('%5d|%02d' % (3, 1)) # 如果只有一个变量或者值,括号可以省略 # 输出 :[][][][]3|01 []代表空格 print('%-5d|%2d' % (3, 1)) # 输出 :3[][][][]|[]1 print('%.2f' % 3.1415926) # 输出:3.14 print('%s,%s,%s,%s' % (1,1.1,True,"String")) # 输出 :1,1.1,True,String print('%d%%' % 5) # 输出:5%
还可以用format()方法,不过比较麻烦:
print("{0} {1}".format("hello", "world") ) # 输出:hello world print('Hello, {0}, 成绩提升了 {1}%'.format('小明', 17.125)) # 输出:Hello, 小明, 成绩提升了 17.125% print('Hello, {0}, 成绩提升了 {1:.2f}%'.format('小明', 17.125)) # 输出:Hello, 小明, 成绩提升了 17.12%
更加详细的语法请看菜鸟教程,这里不再赘述
请登录之后再进行评论