本节重点

  • 彻底掌握字符编码之前的转换关系

  • 掌握 python2 vs python3 上编码的区别

  • 掌握 python2 和python3 上bytes,str 的区别

补充知识点:三元运算

​三元运算又称为三目运算,是对简单的条件语句的简写,如:

​if 条件成立:

​    ​val = 1

​else:

​    ​val = 2

​改写成三元运算:

​val = 1 if 条件成立 else 2

​C#中的写法 int i = 条件成立?1:2

一.字符编码方式

  • ASCII 占1个字符,只支持英文

  • GB2312 占2个字符,支持6700+汉字

  • GBK GB2312的升级版,支持21000+汉字

  • Shift-JIS 日本字符

  • ks_c_5601-1987 韩国编码

  • TIS-620 泰国编码

​由于每个国家都有自己的字符编码方式,所以其对应关系也覆盖了自己国家的字符,但是以上编码都存在局限性,即:仅覆盖本国字符,无其他国家字符的对应关系,应运而生出现了万国码,他覆盖了全球所有的文字和二进制的对应关系。

  • Unicode 2-4字节,已收录了136690个字符,并还在一直不断扩张中..

​Uncode起到了2个作用:

​    ​1.直接支持全球所有语言,每个国家都可以不用再使用自己之前的旧编码了,用uncode就可以了。

​    ​2.unicode包好了全球所有国家编码的映射关系。

​Unicode解决了字符和二进制的对应关系,但是使用unicode表示一个字符,太浪费空间。例如:unicdoe表示“python”需要12个字节才能表示,比原来用ASCII多了一倍,这在进行网络传输,和硬盘存储时是不能容忍的。

​为了解决存储和网络传输的问题,出现了额Unicode Tranformation Format,学术名UTF,即对unicode进行转换,以便于在存储和网络传输时可以节省空间!

  • UTF-8:使用1,2,3,4个字节表示所有字符;优先使用1个字符、无法满足则使增加一个字节,最多4个字节。英文占1个、欧洲语系占2个、东亚占3个、其他及特殊字符占4个。

  • UTF-16:使用2、4个字节表示所有字符;优先使用2个字符、佛则使用4个字节表示。

  • UTF-32:使用4个字节表示所有字符。

总结:UTF是为unicode编码设计的一种在存储和传输时节省空间的编码方案。

二.字符在硬盘上的存储

​无论以什么编码在内存里显示字符,存在硬盘上都是2进制。

​要注意的事,存到硬盘上时是以何种编码存的,再从硬盘上读出来时,就必须以何种编码读,要不然就乱了。

三.编码的转换

​虽然有了unicode和utf-8,但是由于历史问题,各个国家依然在大量使用自己的编码,比如中国的windows,默认编码就是gbk,而不是utf-8。

​基于此,如果中国的软件出口到美国,在美国人的电脑上就会显示乱码,因为他们没有gbk编码。

​为了解决这个问题,就需要使用到unicode的第2个作用,即unicdoe和各国编码的映射关系。

​gbk开发的软件,unicode能自动知道他在unicode中的编码是什么。这样一来,无论你以什么编码存储的数据,只要你的软件吧数据从硬盘里读到内存里,转成unicode来显示,就可以了。由于所有的系统、编程语言都默认支持unicode,那你的bgk软件放在美国电脑上,加载到内存里,变成了unicode,中文就可以正常显示了。

四.python3的执行过程

​1.解释器找到代码文件,把代码字符串按文件头的定义的编码加载到内存,转成unicode。

​2.把代码字符串按语法进行解析

​3.所有的变量字符都会以unicode编码声明

五.编码转换过程

​根据上述所示,python3可以直接读取硬盘上以utf-8编码格式的.py文件,因为python3会把utf-8转成unicode再展示。但是,并不是所有的软件默认编码都是unicode,python2就不是。python2依然使用的是ascii编码方式,当python2打开utf-8格式的文件时会出现乱码。解决的方案有两个,一是python2以utf-8格式打开文件,二是python2以unicode格式打开文件。这时就需要用到编码转换。

​我们来看看Py3自动把文件编码转为unicode是调用了什么方法。

​UTF-8 --> decode解码 -->Unicode

​Unicode --> encode编码 --> GBK / UTF-8

六.python bytes类型

​python2中bytes==str,字符串就是一个个用16进制表示的2进制字节,之所以以16进制来表示,是为了增加可读性。我们称之为bytes类型,即字节类型,它把8个二进制一组称为一个byte,用16进制来表示。除此之外,python2里还有一个单独的类型unicode,把字符串解码后,就会变成unicode。

​python3中str和bytes分开了,str就是unicode格式的字符,bytes就是单纯的二进制。

​注意:python只要出现各种编码问题,无非是哪里的编码设置出错了

​常见的编码错误原因有:

      • python解释器的默认编码

      • python原文件的文件编码

      • Terminal使用的编码

      • 操作系统的语言设置

掌握了编码之前的关系后,挨个排错就好了

python学习之路 三:字符编码的更多相关文章

  1. python学习之路_字符编码

    字符编码及python中的转码问题,这篇博客讲的比较清楚,python 之路,致那些年,我们依然没搞明白的编码

  2. Python学习之路day3-字符编码与转码

    一.基础概念 字符与字节 字符是相对于人类而言的可识别的符号标识,是一种人类语言,如中文.英文.拉丁文甚至甲骨文.梵语等等.    字节是计算机内部识别可用的符号标识(0和1组成的二进制串,机器语言) ...

  3. python学习第四天 --字符编码 与格式化及其字符串切片

    字符编码 与格式化 第三天已经知道了字符串也是一种数据类型,但是,字符串比较特殊的是还有一个编码问题. 因为计算机只能处理数字,如果要处理文本,就必须先把文本转换为数字才能处理.最早的计算机在设计时采 ...

  4. Python学习,第二课 - 字符编码

    关于字符编码 python解释器在加载 .py 文件中的代码时,会对内容进行编码(默认ascill) ASCII(American Standard Code for Information Inte ...

  5. python学习第十八天计算机字符编码

    人类语言和计算机语言二进制怎么沟通,最开始字符编码为ascii码对照表 包括数据和字母,没有汉字,中国自己搞了一套自己的编码 gb2312编码后来发展GBK编码,日本,韩国都,甚至台湾也搞自己的编码, ...

  6. python学习之路三(文件读写)

    # -*- coding: utf-8 -* ''' Created on 2013-7-29 @author: lixingle ''' import os #引入操作文件和目录的函数包 impor ...

  7. python学习之路-day2-pyth基础2

    一.        模块初识 Python的强大之处在于他有非常丰富和强大的标准库和第三方库,第三方库存放位置:site-packages sys模块简介 导入模块 import sys 3 sys模 ...

  8. Python学习之路-Day2-Python基础3

    Python学习之路第三天 学习内容: 1.文件操作 2.字符转编码操作 3.函数介绍 4.递归 5.函数式编程 1.文件操作 打印到屏幕 最简单的输出方法是用print语句,你可以给它传递零个或多个 ...

  9. Python学习之路-Day2-Python基础2

    Python学习之路第二天 学习内容: 1.模块初识 2.pyc是什么 3.python数据类型 4.数据运算 5.bytes/str之别 6.列表 7.元组 8.字典 9.字符串常用操作 1.模块初 ...

随机推荐

  1. nexus3 搭建maven远程仓库

    右上角 下载maven http://maven.apache.org/download.cgi 下载nexus https://www.sonatype.com/download-oss-sonat ...

  2. Spring 学习记录8 初识XmlWebApplicationContext(2)

    主题 接上文Spring 学习记录7 初识XmlWebApplicationContext refresh方法 refresh方法是定义在父类AbstractApplicationContext中的. ...

  3. 关于Redis的常识

    原文出自:http://blog.jobbole.com/44476/ 版本:V3.0.2 2013-7-13 (江南白衣版权所有,转载请保留出处) 1. Overview 1.1 资料 <Th ...

  4. 对于Android NDK编译器ARM和Thumb模式的理解

    编译NDK项目时,编译器无法识别arm汇编,设置LOCAL_ARM_MODE := arm后问题解决, NDK文档上对LOCAL_ARM_MODE的说明如下: LOCAL_ARM_MODE By de ...

  5. opencv3.4 win10 visual studio2017 opencv_contrib 编译

    found Intel IPP (ICV version): 2017.0.3 [2017.0.3] at: D:/opencv/opencv_3_4_0/opencv/my_build/3rdpar ...

  6. spring4-2-bean配置-9-通过工厂方法配置bean

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAjwAAAFICAIAAADbNrOHAAAgAElEQVR4nO2dy7W0uhGFOxWn4JEXAS

  7. SqlServer 分区视图实现水平分表

    我们都知道在数据库数据量较多的时候,可数据进行水平扩展,如分库,分区,分表(也叫分区)等.对于分表的一个方案,就是使用分区视图实现. 分区视图允许将大型表中的数据拆分成较小的成员表.根据其中一列中的数 ...

  8. CNN和GAN 比较nice的介绍

    CNN是个什么鬼:https://www.zhihu.com/question/52668301 就是这样GAN : https://zhuanlan.zhihu.com/p/27199954

  9. RedisHelper in C#

    自己写了一个RedisHelper,现贴出来,希望各位大神能够指正和优化. using System; using StackExchange.Redis; using System.Configur ...

  10. Web测试实践-任务进度-Day02

    小组成员 华同学.郭同学.覃同学.刘同学.穆同学.沈同学 任务进度 在经过任务分配阶段后,大家都投入到了各自的任务中,以下是大家今天任务的进度情况汇总. 华同学 & 刘同学(任务1) 1.对爱 ...