首先搞清楚:Python3的默认编码是unicode,Python2的默认编码是ASCII码

为什么需要编解码?

打个比方:假如说我做了一个游戏,叫《西游记》,游戏传到了日本去。但是日本人的电脑不识别中文,一打开全乱码,所以要进行转换。把中文转换成unicode,然后在转换成为日文。同理中文转换成为日文也要先转换成unicode。

一、Python2的转编码

Python 2 的编解码示意图

注:上图只适用于python 2

几个实例去理解字符的编码问题

实例一:直接编码为unicode看是否能打印

#-*- coding:UTF-8 -*-

s = "你好"
s_to_unicode = s.decode("utf-8")
print(s_to_unicode)

可以打印:因为unicode就支持中文,并且UTF-8是unicode的扩展集,所以在UTF-8编码下可以直接打印unicode,但是GBK就不行。

实例二:转换成GBK后看是否能打印

#-*- coding:UTF-8 -*-

s = "你好"
s_to_unicode = s.decode("utf-8")
print(s_to_unicode)
print(type(s_to_unicode))
s_to_gbk = s_to_unicode.encode("gbk")
print(s_to_gbk)

不可以打印:因为我的xshell终端不支持GBK编码

默认的编码是UTF-8

修改成默认编码后

修改后看是否可以打印

可以打印:因为默认语言就是windows系统编码集(GBK),所以可以打印。此时,上面的unicode没法打印出来(即使unicode可以支持GBK但是必须转码之后才能打印,因为unicode和GBK的编码不是完全一样大的,GBK的“你好”的编码在unicode里对应的不是这两个字)

 实例三:将GBK转回UTF-8

#-*- coding:UTF-8 -*-

s = "你好"
s_to_unicode = s.decode("utf-8")
print(s_to_unicode)
s_to_gbk = s_to_unicode.encode("gbk")
print(s_to_gbk) gbk_to_utf8 = s_to_gbk.decode("gbk").encode("utf-8")
print(gbk_to_utf8)

显然可以打印

实例四:简便的写法

#-*- coding:UTF-8 -*-

s = u"你好"
#u"你好"表示这个字符是unicode编码
#已经是unicode编码的字符不能进行解码,否则会报错
print(s)
s_to_gbk = s.encode("gbk")
print(s_to_gbk) gbk_to_utf8 = s_to_gbk.decode("gbk").encode("utf-8")
print(gbk_to_utf8)

二、Python3的转编码

简介:python3会自动转换utf-8、unicode、gbk,并移除了python的unicode类型,并且转码之后不是文字是字节。

自动转换类型的原因:因为python3的数据类型的编码是unicode所以,直接进行encode解码就行了。

#-*- coding:gbk -*-
#这里只是指的文件编码是gbk
import sys
print(sys.getdefaultencoding())
s = "你好"
#这里的是python本身的数据类型,本身是unicode
#print(s.decode)
#因为本身是unicode,所以不能进行decode命令
print(s.encode("gbk"))
print(s.encode("utf-8"))
print(s.encode("utf-8").decode("utf-8").encode("gb2312"))
#因为最后进行了编码,所以显示出来的是字节形式
#要想显示汉字就要decode解码下,decode要说自己是"gb2312"类型
print(s.encode("utf-8").decode("utf-8").encode("gb2312").decode("gb2312"))

 

注:从运行结果可以看出,GBK和GB2312的字节码是相同的

因为:GBK向下兼容GB18030,GB18030向下兼容gb2312

Python学习日记(二)——字符转编码操作的更多相关文章

  1. Python学习日记(二) list操作

    l = ['a','b','c','d',1,2,[3,'e',4]] 1.list.append() 在list的结尾新增一个新的元素,没有返回值,但会修改原列表 l.append(5) print ...

  2. Python学习日记(二十八) hashlib模块、configparse模块、logging模块

    hashlib模块 主要提供字符加密算法功能,如md5.sha1.sha224.sha512.sha384等,这里的加密算法称为摘要算法.什么是摘要算法?它又称为哈希算法.散列算法,它通过一个函数把任 ...

  3. Python学习日记(二十一) 异常处理

    程序中异常的类型 BaseException 所有异常的基类 SystemExit 解释器请求退出 KeyboardInterrupt 用户中断执行(通常是输入^C) Exception 常规错误的基 ...

  4. Python学习日记(二十六) 封装和几个装饰器函数

    封装 广义上的封装,它其实是一种面向对象的思想,它能够保护代码;狭义上的封装是面向对象三大特性之一,能把属性和方法都藏起来不让人看见 私有属性 私有属性表示方式即在一个属性名前加上两个双下划线 cla ...

  5. Python学习日记(二十三) 类命名空间和组合

    类命名空间 在一个类中它的函数(方法)属于动态属性,直接定义的变量属于静态属性 首先先定义一个类,并在这个类里面加入静态变量.属性等然后将一个对象实例化 class Fighter: #定义一个战机的 ...

  6. python学习笔记(二)---for循环与操作列表

    内容概要 for循环 range(start,end,step)函数 生成随机数列表 list()函数 将range()的结果整合到某个列表 列表的操作 切片(start: end :step) 元组 ...

  7. Python学习日记(二十九) 网络编程

    早期的计算机通信需要有一个中间件,A要给B传东西,A必须要把信息传给中间件,B再把从中间件中拿到信息 由于不同机器之间需要通信就产生了网络 软件开发的架构 1.C/S架构 服务器-客户机,即Clien ...

  8. Python学习日记(二十七) 反射和几个内置函数

    isinstance() 判断isinstance(obj,cls)中obj是否是cls类的对象 class Person: def __init__(self,name): self.name = ...

  9. Python学习日记(二十五) 接口类、抽象类、多态

    接口类 继承有两种用途:继承基类的方法,并且做出自己的改变或扩展(代码重用)和声明某个子类兼容于某基类,定义一个接口类interface,接口类中定义了一些接口名(就是函数名)且并未实现接口的功能,子 ...

  10. Python学习日记(二十四) 继承

    继承 什么是继承?就是一个派生类(derived class)继承基类(base class)的字段和方法.一个类可以被多个类继承;在python中,一个类可以继承多个类. 父类可以称为基类和超类,而 ...

随机推荐

  1. Ocelot + Consul的demo(二)集群部署

    把服务A和服务B接口分别部署在两个ip地址上 修改 services.json文件, { "encrypt": "7TnJPB4lKtjEcCWWjN6jSA==&quo ...

  2. .NET Core中使用读取配置文件

    引入Nuget的两个类库 Microsoft.Extensions.Configuration Microsoft.Extensions.Configuration.Json 使用 var build ...

  3. Linux MySQL 常见无法启动或启动异常的解决方案

    Linux MySQL 常见无法启动或启动异常的解决方案 在 Linux 上自建 MySQL 服务器,经常遇到各种无法启动或启动后异常的问题,本文列举一些常见问题的解决办法. 注意:以下错误日志提示, ...

  4. Linux学习笔记:cut命令

    基础 功能:文件内容查看,显示行中指定部分,删除文件中指定字段.cut 命令用于显示每行从开头算起 a - b 的文字. 语法: cut [-bn] [file.txt] cut [-c] [file ...

  5. # URL异常检测

    (Isolation Forest无监督)这个算法是随机森林的推广. iTree树构造:随机选一个属性,再随机选该特征的一个值,对样本进行二叉划分,重复以上操作. iTree构建好了后,就可以对数据进 ...

  6. flask的多个url对应同一个视图函数

    # -*- coding: utf-8 -*- from flask import Flask app = Flask(__name__) @app.route('/') def index(): r ...

  7. shell for 循环简单用法

    for循环:固定有限次数循环,工作中for使用最多. 语法1: for 变量名 in 变量取值列表 do 指令… done 学习方法:记住下面的内容 for 男人 in 世界 do if [ 有房 ] ...

  8. linux(centos)下安装supervisor进程管理工具

    在接触supervisor进程管理工具之前,使用springboot打包部署到linux服务器的流程是这样子的,如下图所示: 上图展示的就是最一般的流程,如果项目是小项目或者demo可以这样子去部署, ...

  9. Vue 将一个组件嵌入到另一个组件中

    https://github.com/JasmineQian/Vue_Sample App.vue是所有组件的 要嵌入到App.vue组件中, 在script处导入 import xxx  from ...

  10. 解压gz文件有误

    tar: This does not look like a tar archive tar: Skipping to next header tar: Exiting with failure st ...