详谈Python中文件的编码格式

对于Python中的中文字符串的处理方式

一、源代码中的编码方式分析

------所有的文本文件在保存的时候,都会将文本进行编码【数据在计算机中是以二进制的方式存储】,文本的编码方式一般默认为ANSI编码方式(ANSI并不是某一种特定的字符编码,而是在不同的系统中,ANSI表示不同的编码。在英文系统中ANSI编码其实是ASCII编码;在中文系统中ANSI编码其实是GBK编码)。

------如果代码中包含了非ASCII字符(比如中文),而源代码没有声明文件的编码方式,编译器就会默认以ANSI编码方式去对代码中的字符串进行解析,当发现字符串中包含大于127的字节时,就会报错。因此,当源代码中包含非ASCII字符时,需要在文件开头声明文件的编码方式,如utf-8或者gbk。

------然而,文件编码方式的声明只能保证代码的正常执行,并不能保证非ASCII字符串的正常输出显示。上述代码在idle上输出为正常的中文,但是在pycharm上会输出乱码。这是因为不同的IDE对非ASCII字符串的支持程度不同。idle在打印非ASCII字符串时,会使用文件的编码方式将字符串解码成unicode字符串,然后显示到界面上;而pycharm的IDE设置中有一个IDE的编码方式设置,如果源代码的编码方式与IDE的编码方式不同,直接输出非ASCII字符串就会出现乱码。解决方法为将需要打印的非ASCII字符串以源代码的编码方式进行解码,使之转化为unicode字符串。所有实际内容相同的非ASCII字符串转换为unicode编码之后,编码均相同。笔者猜测IDE在打印字符串的时候(不论是不是unicode字符串),会先将字符串统一转化为unicode字符串,然后使用一套机制将unicode字符串打印出来。

二、读写文件时的编码方式分析

对编码方式有了一个初步的认识之后,下面对读写文件时的编码方式进行介绍。
········文本文件都是以字节串的方式存放在硬盘中的。文本编辑器在保存文件的时候,对于非ASCII编码的字符串(如中文),会先使用文件默认的编码方式将其编码为字节串(二进制字节码)。

········程序读取文件时(读取文件是数据由硬盘---》内存;由二进制---》字符串),获取到的内容仍然为编码后的字节串【此时的编码后的字符串并不是Unicode字符串】【此时若不进行解码的话读取出来的字符串会是字符串乱码】【可以使用GBK编码方式或者UTF-8编码方式解码为Unicode字符串】

········若想要恢复文本的内容即使其正常显示,并且对文本内容进行正常的打印,必须先将字节串解码为unicode字符串

a = '你好'  # 存储在内存中的对象(数据存储在计算机内存中)(以Unicode字符串的方式存储)
print(a)  # Pycharm默认设置编码格式为UTF-8--此时打印的是Unicode字符串

s = a.encode('utf-8')  # 将Unicode字符串编码为二进制字节码(可以理解为存储到文件中即计算机硬盘)
print(s)  # 此时打印的数据是a的二进制字节码

print(s.decode(encoding='utf-8'))  # 将二进制字节码解码为Unicode字符串(可以理解为从文件读取数据即从硬盘中读取数据到内存中)

三、关于python中的不同类型数据在计算机中的存储

python带有三种字符串对象类型--一种用于文本数据,两种用于二进制数据:
①str表示Unicode文本(8位和更宽的)----》若想要存储在计算机硬盘中,需要编码为二进制字节码
②bytes表示二进制数据----》可以直接存储在计算机硬盘中
③bytearray表示一种可变的bytes类型----》可以直接存储在计算机硬盘中


注:str.encode():把一个字符串编码为其raw bytes形式【二进制字节码】
bytes.decode(): 把raw bytes节码为其字符串形式
str----->bytes,叫encode【编码】
bytes---->str,叫decode【解码】

常见中文编码名称:
编码名称 用途
utf-8 所有语言
gbk 简体中文
gb2312 简体中文
gb18030 简体中文
big5 繁体中文
big5hkscs 繁体中文


详细解释:
······在计算机内存中,统一使用Unicode编码【内存中数据体现为Unicode字符】,当需要保存到硬盘或者需要传输的时候,就转换为UTF-8编码【保存到硬盘或者传输需要以二进制的方式】
······用记事本编辑的时候,从文件读取的UTF-8字符被转换为Unicode字符到内存里【二进制数据解码为Unicode字符】【此时可以在记事本编辑页面看到】,编辑完成后,保存的时候再把Unicode转换为UTF-8保存到文件【Unicode字符编码为二进制数据】【此时文本中的数据以二进制的方式保存到计算机中】;浏览网页的时候,服务器会把动态生成的Unicode内容转换为UTF-8再传输到浏览器【此时Unicode字符被解码为二进制数据】;所以你看到很多网页的源码上会有类似<meta charset="UTF-8"/>的信息,表示该网页正是用的UTF-8编码。

总结:

 

#中文一般是gbk码,window的系统一般是用gbk编码,但是用这个编码不可以和别的国家语言通用#
#后来出了万国码,unicode,utf-8是它的一部分,别的任何码都可以转成unicode#
python3.x后都是默认用Unicode作为编码。Unicode只能用.encode('')编码成其他编码,但是不编码也可以。
#!-*- coding:utf-8  声明,python2.7的字符编码修改
#-*- coding:gbk -*- 声明,python3.x的字符编码修改
#python2.7默认是ascii码进行解码的
#默认用utf-8的模式时可以在字符串前加u“你好”直接说明是unicode的码下编码的
python转码后它也会将其转成byte类型
sys.getdefaultencoding()#打印系统默认使用的编码
type()#也可以打印编码类型
encode编码
decode解码

 

 



 

posted @ 2021-05-08 19:17  习久性成  阅读(2205)  评论(0编辑  收藏  举报