Python字符编码

【一】什么是字符编码

  • 计算机基于电工作,电的特性有高低电平,所以人为的从逻辑层面将高电平对应数字1,低电平对应数字0
  • 及计算机内部数据全是0和1,只能识别0和1
  • 字符编码就是将人们沟通交流媒介(字母、数字等信息)和计算机的二进制内容进行一一对应

【二】字符编码的发展

【1】阶段一:ASCII码

(1)ASCII码起源
  • 计算机起源于美国,所以自然而然的仅仅制作了英文字符等信息和计算机二级制内容一一对应关系的表,及ASCII表
(2)ASCII码特点
  • 1Bytes=8bit,8bit最多包含2^8=256个数字,可以对应256个字符,足够表示所有英文字符和一些特殊字符,所以用一个字节对应一个英文字符
  • 数字的ASCII码 < 大写字母ASCII < 小写字母ASCII

Python字符编码_第1张图片

【2】阶段二:ASCII/GBK/Shift_JIS

  • 各个国家发展起来,开始使用计算机,都需要制作自己国家语言和计算机二进制所对应的表

  • 美国字符编码标准是ASCII

  • 中国字符编码标准是GBK

    • 中文汉字远远大于256(一个字节)个,及一个字节不可能表示所有汉字
    • 一个中文需要两个字节表示,2B=16b, 2^16=65,536
  • 日本字符编码标准是Shift_JIS

【3】阶段三:万国码unicode

  • 每个国家都有自己的编码,互相交流过于复杂,所以需要制定全球都可以使用的编码

  • 软件是存放于硬盘的,而运行软件是要将软件加载到内存的,面对硬盘中存放的各种传统编码的软件,想让我们的计算机能够将它们全都正常运行而不出现乱码,内存中必须有一种兼容万国的编码,并且该编码需要与其他编码有相对应的映射/转换关系

Python字符编码_第2张图片

  •   **CPU**     --->             **内存**             --->         **硬盘**  
    
  •   英文字符--->unciode格式的数字--->ASCII格式的数字
    
  •   中文字符--->unicode格式的数字--->gbk格式的数字
    
  •   日文字符--->unicode格式的数字--->shift_JIS格式的数字
    

【三】编码和解码

【1】编码(encode)

  • 由字符转换成内存中的unicode,以及由unicode转换成其他编码的过程,都称为编码encode
  • 简单的说就是能看懂的翻译计算机可以看懂的
x = '上海'
res = x.encode('utf-8')
print(res, type(res))  # b'\xe4\xb8\x8a\xe6\xb5\xb7' 

# 只有英文字符和数字,要想编码的话,直接使用前缀b --- 字节对象没有encode方法
s = b'Tom321'
print(s, type(s))      # b'Tom321' 

Python字符编码_第3张图片

【2】解码(decode)

  • 由内存中的unicode转换成字符,以及由其他编码转换成unicode的过程,都称为解码decode
  • 简单的说就是计算机能看懂的翻译可以看懂的
x = b'\xe4\xb8\x8a\xe6\xb5\xb7'
res = x.decode('utf-8')
print(res, type(res))       # 上海 

s = b'Tom321'
res = s.decode('utf-8')
print(res, type(res))       # Tom321 

Python字符编码_第4张图片

【四】utf-8

【1】utf-8的诞生

  • 最早的Unicode有16位,即个字节

  • 如果用来表示中文,两个字节刚刚好;如果用来表示英文,那么显然会浪费一个字节

    • 第一点:浪费存储空间

    • 第二点:读取和写入的速度会大打折扣

  • 所以万国码unicode必须将其转换成一种精简的格式utf-8

    • utf-8是针对Unicode的可变长度字符编码:
      • 一个英文字符占1Bytes,
      • 一个中文字符占3Bytes,生僻字用更多的Bytes存储
    • 我们日常使用的字符编码都是utf8编码,但是,utf系列还有utf16 utf32… utf8mb4

【2】为何在硬盘中不直接使用utf-8

  • utf-8是可变长度长度编码
  • 如果使用utf-8存储,那么需要花费一定的资源截断或者截取字符
  • 大多数情况下:utf-8用来传输 ,utf-16用来存储

【五】字符编码–乱码

【1】存乱了

  • 含有中文和英文的数据按照ASCII码存储,中文找不到对应的ASCII码,所以就会乱码

【2】读乱了

  • 按照ASCII码的方式读取GBK的数据,找不到对应的值,也会乱码

【3】常见的乱码问题

(1)程序乱码(python2->python3)
  • python解释器读文件时采用的编码方式设置为文件当初写入硬盘时的编码格式

  • 在python3中默认为utf-8,在python2中默认为ASCII

  • 我们可以通过指定文件头来修改默认的编码

    # coding: 当初文件写入硬盘时采用的编码格式
    # coding: ASCII                # python2的程序前面添加
    
(2)输出乱码(python3->python2)
  • 在python3中字符串的值都是按照unicode格式存储

  • 然而python2是盛行早于unicode,python3的程序在python2的解释器上大概率会出错

  • 所以在编写python3字符串时,在前面加上u(unicode),字符串就会按照unicode存储,避免了报错

    # coding:utf-8
    x = u'上海' # 即便文件头为utf-8,x的值依然存成unicode
    print(x)
    

你可能感兴趣的:(python,开发语言)