字符编码

Python-08

@(Python)

字符编码

什么是字符编表

  • 把人类的字符,解释为计算机能识别的二进制,这种转换遵循的标准就是字符编码表
  • 字符编码表记录了人类字符与数字的对应关系

字符编码表的种类和使用

ASCII编码表

  • ASCII编码表用于,英文和二进制的对照关系,存取都是以ASCII格式的二进制存取
  • 一个英文字母占8bit
  • ASCII编码表只能解释英文符号

GBK编码表

  • GBK编码表用于,中文和二进制的对照关系,存取都是以GBK格式的二进制存取
  • 一个中文符号占16bit,一个英文字母占8bit
  • GBK编码表只能解释中、英文符号

unicode编码表

  • unicode编码格式,可以跟其他所有的编码格式互相转码
  • unicode编码只在内存中使用,目前所有编码字符的字符在内存中都是以unicode格式的二进制形式呈现,并且只有unicode在内存中,其他字符编码都在硬盘上
  • unicode把全世界的字符都建立好对应关系,保证了在内存中不出现乱码
  • unicode的好处是可以跨平台,在任何平台打印都不会乱码
  • unicode使用2Bytes(16bit)表示一个字符,缺点是小于2Bytes的字符也会占用2Bytes的空间(不足16bit的用0补齐)
  • unicode编码表和其他字符编码表的对应关系,如下图:

Alt text

utf-8编码表

  • utf-8英文全称 unicode tranform format-8,是unicode编码表的转换版本
  • 作用是,解决了unicode占用空间的缺点,将内存中unicode编码后的二进制,更节省空间的存入磁盘
  • utf-8编码表没有和各个国家的对应关系,因此内存中不用utf-8
  • utf-81Bytes表示英文,用3Bytes表示中文

总结:

  • 因为历史原因,各个国家为了用自己的语言使用计算机,都有自己编码表,为了进行统一,出现了unicode编码来进行过度,utf-8编码表用来逐步代替其他的编码表

乱码的原因是什么?

  • 存的时候是以A编码格式存,读的时候用B编码格式读,就会出现乱码

如何避免乱码?

  • 要保证存取文件不乱码,应该开始用什么编码存的,以后就用什么编码读

Python2和Python3在字符编码上的区别

  • Python3解释器默认的字符编码是UTF-8
  • Python2解释器默认的字符编码是ASCII
  • python2会根据文件头编码的格式,将变量值存到内存,如果想要存为unicode就需要在变量值前加u,比如x=u'a'u代表unicode
  • Python3不管文件头是什么编码格式,都会转化为unicode存放在内存中

如何指定编码文件头

  • 文件开头格式:#coding:当初存的时候的编码 的形式,比如#coding:gbk 指定读的时候用什么编码读
  • Linux中使用#!/usr/bin/env python

python2中查看值在内存中,实际存为的十六进制(都是二进制,以十六进制显示)

Alt text

在Python2中有两种字符串编码格式

  • unicode格式:x=u'上'
  • unicode编码后的结果,如果文件头为#coding:utf-8,那么'上'被存为utf-8格式
  • 在Python3中只有一种字符串编码格式:unicode格式:x='上'

内存中固定使用unicode编码,唯一能改变的是存储到硬盘时

编码与解码

  • 编码形式:unicode --- encode编码 ---> gbkunicode只能编码,不能解码
  • 解码形式:unicode <--- decode解码 --- gbk

Alt text

总结

Python2总结:

  • 在Python2中的字符串类型str都是unicode按照文件头的指定的编码,编码之后的结果
  • 在Python2中也可以制造unicode编码的字符串,需要在字符串前加u

Python3总结:

  • 在Python3中的字符串类型str都是unicode编码的
  • 所以Python3中的字符串类型可以编码成其他字符编码格式,编码的结果是bytes类型
  • Python3中要从内存写入硬盘,必须要从unicode转化成bytes类型,即只有其他编码格式才能在硬盘上保存

  • bytes可以当成二进制看
  • 字符编码只和文本文件有关,与视频、音频、图片等文件无关
posted @ 2018-08-08 16:21  Xut  阅读(221)  评论(0编辑  收藏  举报