python 字符编码

1、存取文件不乱码的法则:用什么编码存的,就要用什么编码读

2、           decode             encode

bytes------------->unicode---------->bytes

3、python3解释器默认使用的字符编码是utf-8

     python2解释器默认使用的字符编码是ascii

4、python2的str就是python3的bytes

     python2的unicode就是python3的str

5、unicode 打印编码:

     pycharm的终端是utf8的编码,要按照打印终端的编码来显示出来.

     windows的终端是gbk的编码

     linux的终端是utf8的编码

总结字符编码的发展可分为三个阶段:

阶段一:现代计算机起源于美国,最早诞生也是基于英文考虑的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

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类型

 

posted on 2017-12-12 22:44  蜗牛也是妞  阅读(311)  评论(0编辑  收藏  举报