什么是字符串
字符串(string)是由字符(character)构成的序列(sequence)。例如abc北京
就是由a
、b
、c
、北
、京
构成的一个字符串。
什么是字节串
计算机中所有的东西都需要数值来表示,字符也不例外。每个字符需要若干个字节表示(取决于编码的方案)。P.S. 字节是最小的存储单位。
例如,采用 UTF-8 编码,上述五个字符对应的编码如下:
a
:\x61
b
:\x62
c
:\x63
北
:\xe5\x8c\x97
京
:\xe4\xba\xac
因此,abc北京
在 UTF-8 编码方案下对应的字节串是\x61\x62\x63\xe5\x8c\x97\xe4\xba\xac
。
如果采用 GB2312 编码,上述五个字符对应的编码如下:
a
:\x61
b
:\x62
c
:\x63
北
:\xb1\xb1
京
:\xbe\xa9
因此,abc北京
在GB2312
编码方案下对应的字节串是\x61\x62\x63\xb1\xb1\xbe\xa9
。
从上面可以发现,同样的字符串,不同的编码方案可能会产生不同的字节串。
应用
打开文件“乱码”
文本在计算机中是以字节串的形式存储的,当编辑器打开文件时,便会按照某一种编码方案对硬盘中存储的字节串进行解码,如果解码过程用的编码方案与编码过程用的编码方案一致便可以正常显示,如果不一致就可能出现乱码的情况。
Python 中的文件 IO
P.S. 这一部分是自己的理解,真实性有待核查。
在 Python 中,当我们用open
函数打开文件时,需要指定编码类型:
# 若不指定,Python 会根据 OS 提供一个默认值
f = open("a.txt", encoding="utf-8")
当文件被从计算机中读出时,在 Python 的文件对象中便存下了字节串和该文件的编码。例如,将字符串abc北京
从文件中读出时,计算机中存储的便是\x61\x62\x63\xe5\x8c\x97\xe4\xba\xac
这一串字节串和编码方案utf-8
。当需要赋值给字符串变量时,字符串变量s
的字节码就是在unicode
编码方案下abc北京
对应的字节码。
将字符串abc北京
写入文件中时,也是先检查文件的编码方案,如GB2312
,然后将abc北京
在GB2312
下的编码存入文件中。