字符串

7 阅读3分钟

字符串编码

常见概念

  1. bit 比特、位、比特位,计算器处理数据的最基本单位,只能是0或1
  2. byte 字节,1个字节等于8个bit
  3. ASCII编码 将字母、数字和一些符号进行了编码,一个字符是一个字节。 一个字节是8个bit,8位二进制数最多能表示255个字符
  4. UNICODE编码 为了能存更多的字符,引入了UNICODE编码,通常一个字符占两个字节,两个字节是16位二进制数,最多能表示65535个字符
  5. UTF-8编码 对于字母,用一个字节表示,如果用unicode就会在前边补8个0,占用存储大了一倍,所以引入utf-8可变长编码,通常一个字母占1个字节,一个汉字占3个字节,编码中的字符占用最多的6个字节 UTF-8编码有一个额外的好处,就是ASCII编码实际上可以被看成是UTF-8编码的一部分,所以,大量只支持ASCII编码的历史遗留软件可以在UTF-8编码下继续工作。

编码工作方式

内存中,统一使用Unicode编码,当保存到硬盘或者传输时,就转换为UTF-8。 用记事本编辑的时候,从文件读取的UTF-8字符被转换为Unicode字符到内存里,编辑完成后,保存的时候再把Unicode转换为UTF-8保存到文件

python3中字符串编码问题

python3中字符串是用unicode编码的,所以py3的字符串支持多语言 Python提供了ord()函数获取字符的整数表示,chr()函数把编码转换为对应的字符 ord('中') 20013 chr(25991) '文' '\u4e2d\u6587' '中文' 十六进制 Python对bytes类型的数据用带b前缀的单引号或双引号表示:x=b'hello'。bytes的每个字符都只占用一个字节

以Unicode表示的str通过encode()方法可以编码为指定的bytes 'ABC'.encode('ascii') b'ABC' '中文'.encode('utf-8') b'\xe4\xb8\xad\xe6\x96\x87'

反过来,如果我们从网络或磁盘上读取了字节流,那么读到的数据就是bytes。要把bytes变为str,就需要用decode()方法: b'ABC'.decode('ascii') 'ABC' b'\xe4\xb8\xad\xe6\x96\x87'.decode('utf-8') '中文' b'\xe4\xb8\xad\xff'.decode('utf-8', errors='ignore') '中'

要计算str包含多少个字符,可以用len()函数: len('ABC') 参数是字符,返回就是字符数 len('中文'.encode('utf-8')) 参数如果是字节,那就返回字节数 为了避免乱码问题,应当始终坚持使用UTF-8编码对str和bytes进行转换

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

第一行注释是为了告诉Linux/OS X系统,这是一个Python可执行程序,Windows系统会忽略这个注释; 第二行注释是为了告诉Python解释器,按照UTF-8编码读取源代码,否则,你在源代码中写的中文输出可能会有乱码。 申明了UTF-8编码并不意味着你的.py文件就是UTF-8编码的,必须并且要确保文本编辑器正在使用UTF-8编码。

格式化字符串

  1. 百分号 有几个%?占位符,后面就跟几个变量或者值,顺序要对应好。如果只有一个%?,括号可以省略。
'Hello, %s' % 'world'
'Hello, world'
'Hi, %s, you have $%d.' % ('Michael', 1000000)
'Hi, Michael, you have $1000000.'
  1. format方法
'Hello, {0}, 成绩提升了 {1:.1f}%'.format('小明', 17.125)
'Hello, 小明, 成绩提升了 17.1%'
  1. 以f开头的字符串 字符串如果包含{xxx},就会以对应的变量替换
r = 2.5
s = 3.14 * r ** 2
print(f'The area of a circle with radius {r} is {s:.2f}')