有时在读取文件时是否会出现乱码?因为在中文Windows系统中,如果不指定文本文件的编码,那么它就会采用系统默认的GBK编码,即一个英文字符是ASCII码,一个汉字是两个字节的内码。文件的本质是二进制文件,相同的文本采用不同的编码得到的二进制数据是不同的。
解决方案
GBK编码执行文件后是7个字节,分别是Ox61Ox62 OX63 Oxce Oxd2 Oxc3 Oxc7
fobj=open('c:\\abc.txt','wt',encoding=’gbk’)fobj.write('abc 我们')fobj.close() |
---|
其中前三个是abc符号,Oxce Oxd2是‘我’,Oxc3 Oxc7是‘们’。
而在open中用encoding参数指定UTF-8编码,执行后就是9个字符,它们分别是:
Ox61 Ox62 Ox63 Oxe6 Ox88 Ox91 Oxe4 OxbbOxac.其中Oxe6 Ox88 Ox91是‘我’,
Oxe4 Oxbb Oxac是‘们’。
使用方法:
def writeFile(): f=open('abc.txt','wt',encoding='utf-8') f.write('abc我们') f.close()def readFile(): f=open('abc.txt','rt',encoding='utf-8') for s in f.readlines(): print(s,end='') f.close()try: writeFile() readFile()except Exception as e: print(e) #运行结果adc我们 |
---|
当使用的编码不一致时就会出现以下情况:
def writeFile(): f=open('abc.txt','wt',encoding='utf-8') f.write('abc我们') f.close()def readFile(): f=open('abc.txt','rt',encoding='gbk') for s in f.readlines(): print(s,end='') f.close()try: writeFile() readFile()except Exception as e: print(e) #运行结果abc鎴戜滑 |
---|
结语
文本读取的默认编码是GBK,所以想用GBK读文件时可以用encoding参数,也可以不用,它会默认的使用GBK,但如果要使用UTF-8编码就必须用encoding参数指定。