文件编码:
知识点不多,但及其重要,python2和python3处理机制还有不同点,需要注意。
首先:
编码、数据类型,完全不同的概念。
文件编码:可以遵循开发环境、可以自行设定。
变量值编码:python2、我不清楚,貌似可以设定吧sys.setdefaultcode()方法设定?
python3、变量值默认的编码就是unicode
简述一下,编码从utf-8到gbk过程:
utf-8 --> unicode --> gbk
gbk转为utf-8
gbk --> unicode --> utf-8
也就是说传说中的万国码,就是厉害。通过它可以转任何。
python2中:
#字符转编码:#python2 原编码(utf8) --> 目标编码(gbk),需要 str.decode("utf-8").encode("gbk"),#第一步的decode方法用于转码为unicode,参数为我当前是什么编码的(utf8),#第二步的encode方法用于从unicode到目标编码(gbk),参数为目标编码(gbk)#decode目标是unicode,encode源是unicode,不能跨过unicode直接用encode转为目标编码,这是字符转码的标准流程。
importsysprint(sys.getdefaultencoding()) #打印python环境的默认编码
s="你好"s_to_gbk=s.decode("utf-8").encode("gbk") #decode过程就变成unicode再encode到目标
print(s_to_gbk,type(s_to_gbk))
python3中:
存储为unicode编码,可以直接进行转码encode()方法,但是数据类型会被变为byte,不重要,编码反正转了。
可以通过decode()方法转为字符串,但此时仅改变了数据类型,编码没有发生变化,就是encode()时的编码。
编码、数据类型 完全不同的概念
#python3 过程一样,先到转到unicode,再到目标编码,#但是,python3,底层存储时的值就是unicode编码的,所以字符串变量不再提供decode方法#由此,明确两个问题#1、python3,直接str.encode("目标编码"),只是变成了byte数据类型,不过编码就是目标编码。#2、python3,既然编码过程无变化,如果有需求,#str.encode("utf-8").decode("utf-8").encode("gbk")#这是为了明确转码过程,实际应用不大,因为unicode编码是万国码,需要对接本地码程序需求的话,直接转就行了
importsysprint(sys.getdefaultencoding()) #打印python环境的默认编码
s="你哈"
print(s.encode("gbk")) #unicode直接转gbk的输出结果
print(s.encode("utf-8")) #unicode直接转utf-8的输出结果(byte类型,编码正确)
print(s.encode("utf-8").decode("utf-8").encode("gbk")) #unicode直接转utf-8,再转为unicode,再转为gbk,(还是byte类型,编码正确)#经过完整流程后,与直接转gbk结果相同,这个就是为了证明流程、结果的正确#python3中,只有encode()方法以后,数据类型都是byte,编码是指定编码,无参就是默认编码 可以再转回字符串的。。。#decode()方法就行了,参数要根据实际参数传,不传可以,除非可以确定这个需要转回字符串的比byte类型的数据,就是默认编码,不然就异常。
s_to_gbk=s.encode("gbk").decode("gbk") #decode不写gbk,会报异常说,gbk不能转到响应目标编码,
print(s_to_gbk,type(s_to_gbk)) #证明转回了字符串类型,并且是gbk编码的#python3,在encode的时候除了转了编码,同时转了数据类型变为byte