python3.x Day3 文件编码

文件编码:

知识点不多,但及其重要,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转为目标编码,这是字符转码的标准流程。

import sys
print(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编码是万国码,需要对接本地码程序需求的话,直接转就行了
import sys
print(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

 

posted @ 2017-10-25 17:29  王玥  阅读(272)  评论(0编辑  收藏  举报