字符编码

字符编码就是将人能识别的字符编码翻译成计算机能识别的二进制。

  • 几种字符编码的对比:

编码编码方式表示字符数特点
ANSⅡ1 Byte (8bit) 表示一个字符255适用于英文,表示的字符数太少,非字母文字表示不了。
Unicode2 Bytes (16bit) 表示一个字符655535兼容万国语言;所有字符统一用两个字节表示,转换速度快;但对于英文文本,存储空间多了一倍;内存使用unicode编码,以空间换速度
UTF-8
可变字符编码:英文 用1Byte,其它语言用2-4Bytes所有兼容万国语言;占用空间比小;转换相对较慢;磁盘和网络使用这种编码:I/O延迟 > UTF-8转换速度;节省带宽

  • 计算机中字符编码的转换:


可以看出,unicode只能encode。

  • 实例:
    当我们运行一个文本编辑器,编辑内容有中文和日文时,因为编辑时是在内存中,所以是unicode编码,两种语言显示都没有问题。但是,当我们要保存文件,刷入硬盘时,如果指定以日文编码shfit-jis保存,那么效果如下:
    unicode(内存中编辑的内容) ==> encode ==>shfit-jis(以日文编码方式保存二进制到硬盘),日文编码没办法对中文字符进行处理。
    当我们再读入这个文件时:
    shfit-jis(以日文编码保存再硬盘的二进制文本) ==> decode ==> unicode 由于中文字符没有被编码,这时显示乱码
  • 防乱码法则:文件按什么编码存的,就按什么编码打开。
  • python 2 在打开一个文件时,默认是以ANSⅡ编码来读。如果文件是以utf-8保存的,就会出现错误。解决方案:在文件第一行加入文件头:# -*- coding: utf-8 -*-,这样,就可以指定读文件时的编码方式。
  • python 2 的字符编码:
    python 2 中字符串有两种类型:str 和 unicode
    >>> s = 'a'
    >>> print(type(s))
    <type 'str'>
    >>> s = u'a'
    >>> print(type(s))
    <type 'unicode'>
    >>>
    
python 因为出现的比unicode早,所以在python2中字符串默认是str类型,而不是unicode类型,在定义字符串时,开辟unicode内存空间,再encode(以文件头指定的编码方式,但是,只有unicode才能encode, 所以字符串已经是编码后的结果了,此时只能decode。所以python2中,字符串在内存中的编码就是文件头指定的编码方式)为bytes来存放字符串。需要在定义字符串时在前面加u来指定为unicode的编码方式来存放字符串。
  • pypython3 解释器打开文件,默认以utf-8编码来读,把utf-8编码转化为unicode编码存放在内存。在编辑,保存,读取阶段,都只是字符,解释器在执行时,才有字符串的概念,比如执行到x = 'hello'时,识别引号内的字符是字符串。
  • 在程序执行阶段,有定义的变量时,会申请新的内存空间来存放变量的值,字符串在python3中默认是以unicode编码方式存放。但是也可以通过.encode('utf-8')指定编码方式:例如定义一个字符串 a = 'ayahn'.encode('utf-8'),就是将unicode encode成为 bytes。
    y = 'ayahn'.encode('utf-8')
    print(y)
    b'ayahn'  # b表示bytes类型的字符串 
    print(type(y))
    
    <class 'bytes'>
    z = 'hello'
    print(type(z))
    <class 'str'>
    
    name = '黄'.encode('utf-8')
    print(name)
    b'\xe9\xbb\x84' # 汉字用三个字节表示,说明确实是以utf-8编码的方式存放在内存中  
    
    
    
  • 将字符串打印到终端(比如命令行交互窗口,中文windows默认以gbk编码来读),本质就是将python内存空间的内容显示在另一个内存空间,即从一块儿unicode编码的二进制存放空间到另一块unicode编码的二进制存放的空间。对于python2来说,就是:
    bytes(字符串在python2的内存空间的形式) = ==> unicode(显示终端在内存中的形式) ,就会乱码。所以如果字符串默认以unicode编码的二进制存放再内存中的话,这样不论打印到任何终端,都不会乱码。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值