详谈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的编码⽅式设置,如果源代码的编码⽅式与ID
E的编码⽅式不同,直接输出⾮ASCII字符串就会出现乱码。解决⽅法为将需要打印的⾮ASCII字符串以源代码的编码⽅式进⾏解码,使之转化为unicode字符串。所有实际内容相同的⾮ASCII字符串转换为unicode编码之后,编码均相同。笔者猜测IDE在打印字符串的时候(不论是不是unicode字符串),会先将字符串统⼀转化为unicode字符串,然后使⽤⼀套机制将unicode字符串打印出来。
⼆、读写⽂件时的编码⽅式分析
对编码⽅式有了⼀个初步的认识之后,下⾯对读写⽂件时的编码⽅式进⾏介绍。
········⽂本⽂件都是以字节串的⽅式存放在硬盘中的。⽂本编辑器在保存⽂件的时候,对于⾮ASCII编码的字符串(如中⽂),会先使⽤⽂件默认的编码⽅式将其编码为字节串(⼆进制字节码)。
········程序读取⽂件时(读取⽂件是数据由硬盘---》内存;由⼆进制---》字符串),获取到的内容仍然为编码后的字节串【此时的编码后的字符串并不是Unicode字符串】【此时若不进⾏解码的话读取出来的字符串会是字符串乱码】【可以使⽤GBK编码⽅式或者UTF-8编码⽅式解码为Unicode字符串】。
········若想要恢复⽂本的内容即使其正常显⽰,并且对⽂本内容进⾏正常的打印,必须先将字节串解码为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类型----》可以直接存储在计算机硬盘中
注:de():把⼀个字符串编码为其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类型
type()#也可以打印编码类型
encode编码
decode解码
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论