Python学习日记(二)——字符转编码操作
首先搞清楚: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学习日记(二)——字符转编码操作的更多相关文章
- Python学习日记(二) list操作
l = ['a','b','c','d',1,2,[3,'e',4]] 1.list.append() 在list的结尾新增一个新的元素,没有返回值,但会修改原列表 l.append(5) print ...
- Python学习日记(二十八) hashlib模块、configparse模块、logging模块
hashlib模块 主要提供字符加密算法功能,如md5.sha1.sha224.sha512.sha384等,这里的加密算法称为摘要算法.什么是摘要算法?它又称为哈希算法.散列算法,它通过一个函数把任 ...
- Python学习日记(二十一) 异常处理
程序中异常的类型 BaseException 所有异常的基类 SystemExit 解释器请求退出 KeyboardInterrupt 用户中断执行(通常是输入^C) Exception 常规错误的基 ...
- Python学习日记(二十六) 封装和几个装饰器函数
封装 广义上的封装,它其实是一种面向对象的思想,它能够保护代码;狭义上的封装是面向对象三大特性之一,能把属性和方法都藏起来不让人看见 私有属性 私有属性表示方式即在一个属性名前加上两个双下划线 cla ...
- Python学习日记(二十三) 类命名空间和组合
类命名空间 在一个类中它的函数(方法)属于动态属性,直接定义的变量属于静态属性 首先先定义一个类,并在这个类里面加入静态变量.属性等然后将一个对象实例化 class Fighter: #定义一个战机的 ...
- python学习笔记(二)---for循环与操作列表
内容概要 for循环 range(start,end,step)函数 生成随机数列表 list()函数 将range()的结果整合到某个列表 列表的操作 切片(start: end :step) 元组 ...
- Python学习日记(二十九) 网络编程
早期的计算机通信需要有一个中间件,A要给B传东西,A必须要把信息传给中间件,B再把从中间件中拿到信息 由于不同机器之间需要通信就产生了网络 软件开发的架构 1.C/S架构 服务器-客户机,即Clien ...
- Python学习日记(二十七) 反射和几个内置函数
isinstance() 判断isinstance(obj,cls)中obj是否是cls类的对象 class Person: def __init__(self,name): self.name = ...
- Python学习日记(二十五) 接口类、抽象类、多态
接口类 继承有两种用途:继承基类的方法,并且做出自己的改变或扩展(代码重用)和声明某个子类兼容于某基类,定义一个接口类interface,接口类中定义了一些接口名(就是函数名)且并未实现接口的功能,子 ...
- Python学习日记(二十四) 继承
继承 什么是继承?就是一个派生类(derived class)继承基类(base class)的字段和方法.一个类可以被多个类继承;在python中,一个类可以继承多个类. 父类可以称为基类和超类,而 ...
随机推荐
- 【Transact-SQL】计算整个表中所有值的出现的次数
原文:[Transact-SQL]计算整个表中所有值的出现的次数 一个表有3列,5行,那么一共有15个值,现在要计算整个表中所有值在表中出现的次数,不过这里表的列数是不确定的,上面的例子是3列,实际上 ...
- angular 源码 <一> rotuerLinkActive
这几篇,查看angular 源码. rotuerLinkActive 是路由的样式设置. 它的值是 css 的一个类.或者几个类. 主要代码如下 @Input() set routerLinkActi ...
- JVM学习笔记——类加载过程
JVM学习笔记——类加载过程 类加载模型——双亲委派模型(Parents Delegation Model)也可称为“溯源委派加载模型” Java的类加载器是一个运行时核心基础设施模块,主要是启动之初 ...
- Java 面向对象(五)抽象
一.抽象概述 1.由来 父类中的方法,被它的子类们重写,子类各自的实现都不尽相同.那么父类的方法声明和方法主体,只有声明还有意义,而方法主体则没有存在的意义了. 我们把没有方法主体的方法称为抽象方法. ...
- Linux上使用trash回收机制来替换rm命令
因为我们日常使用的rm 命令没有恢复机制,删除了文件就找不到了,往往重要的文件,我们要特别小心才对,但是有时还是避免不了我们的误操作.可能会造成很大的影响. 本博文简单介绍一下,用trash命令仿照W ...
- vue作用域插槽
简而言之,作用域插槽就是让插槽内容能够访问子组件中的数据. 案例如下:有CurUser组件 <template> <span> <!-- 在slot 元素上绑定user, ...
- Kafka的性能分析
都说Kafka的吞吐量很大,但是我一直不直到Kafka为何有如此大的吞吐量.最近在看Kafka权威指南,陆陆续续得到了如下结论: 1.分区:Kafka支持分区,这样就支持多个生产者和多个消费者同时请求 ...
- ubuntu安装supervisor
1. Ubuntu14中supervisor的安装及配置 2. Ubuntu 14.04下进程管理工具supervisor安装 3. Supervisor使用教程 4. supervisor在deep ...
- Codeforces 1187 F - Expected Square Beauty
F - Expected Square Beauty 思路:https://codeforces.com/blog/entry/68111 代码: #pragma GCC optimize(2) #p ...
- ndk学习之C语言基础复习----虚拟内存布局与malloc申请
在这一次中来学习一下C语言的内存布局,了解它之后就可以解释为啥在用malloc()申请的内存之后需要用memset()来对内存进行一下初始化了,首先来了解一下物理内存与虚拟内存: 物理内存:通过物理内 ...