1、存取文件不乱码的法则:用什么编码存的,就要用什么编码读
2、 decode encode
bytes------------->unicode---------->bytes
3、python3解释器默认使用的字符编码是utf-8
python2解释器默认使用的字符编码是ascii
4、python2的str就是python3的bytes
python2的unicode就是python3的str
总结字符编码的发展可分为三个阶段:
阶段一:现代计算机起源于美国,最早诞生也是基于英文考虑的ASCII
ASCII:一个Bytes代表一个字符(英文字符/键盘上的所有其他字符),1Bytes=8bit,8bit可以表示0-2**8-1种变化,即可以表示256个字符
阶段二:为了满足中文和英文,中国人定制了GBK
GBK:2Bytes代表一个中文字符,1Bytes表示一个英文字符;为了满足其他国家,各个国家纷纷定制了自己的编码,日本把日文编到Shift_JIS里,韩国把韩文编到Euc-kr里
阶段三:各国有各国的标准,就会不可避免地出现冲突,结果就是,在多语言混合的文本中,显示出来会有乱码。
于是出现了unicode(定长), 统一用2Bytes代表一个字符, 虽然2**16-1=65535,但unicode却可以存放100w+个字符,因为unicode存放了与其他编码的映射关系,准确地说unicode并不是一种严格意义上的字符编码表。很明显对于通篇都是英文的文本来说,unicode的式无疑是多了一倍的存储空间,于是产生了UTF-8(可变长,全称Unicode Transformation Format),对英文字符只用1Bytes表示,对中文字符用3Bytes,对其他生僻字用更多的Bytes去存
要想保证文件不乱码,用什么编码存的就用什么编码取.
x=‘上‘
python2:启动python解释器,把文件从内存读出(以默认ASCII码), bytes=str
申请内存空间存储字符串
#coding:gbk
print(‘上‘)
print([x])
内存空间存的值[‘\xc9\xcf‘] #(GBK),2个bytes,4个16进制数
print([x.decode(‘gbk‘)]) #以什么编码存的就用什么编码取
[u‘\u4e0a‘](unicode) #解码
y=x.decode(‘gbk‘) #y是Unicode类型,可以转化为任意类型
print([y.encode(‘utf-8‘)])
x=u‘上‘
print(type(x)) #python2 有直接的unicode的类型,可以encode其他编码.建议都加u
unicode
打印编码:pycharm的终端是utf8的编码,要按照打印终端的编码来显示出来.
windows的终端是gbk的编码
linux的终端是utf8的编码
python3:启动python解释器,把文件从内存读出(以默认UTF-8码) #coding:gbk 告诉python解释器以什么编码读取存储字符串
x=‘上‘
y=x.encode(‘gbk‘) #只能encode证明python3默认就是以unicode存.
print(y,type(y))
b‘\xc9\xcf‘ <class ‘bytes‘> #python3的bytes类型就是python2的str类型,所有的字符串编码都是bytes类型
#文件编码(存)默认就是utf-8类型,字符串编码默认是unicode类型