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中,一个类可以继承多个类. 父类可以称为基类和超类,而 ...
随机推荐
- MySQL 的COUNT(x)性能怎么样?
做一个积极的人 编码.改bug.提升自己 我有一个乐园,面向编程,春暖花开! x 可以代表: 主键id.字段.1.* 0 说明 对于count(主键id)来说 innodb引擎会遍历整张表,把每一行的 ...
- 生成 excel 插件 Epplus
最近做 .net core 项目 发现一个新的 生成excel 的插件 . 以前值用 aspose 或者 npio. 简介:Epplus是一个使用Open Office XML(Xlsx)文件格式,能 ...
- Laravel with 查询指定的字段(非复制的哦)
问题: 在with里面指定查询字段,结果是null. 在模型里面指定查询字段,结果是null. 解决办法: 在查询指定字段的时候要顺带着查询关联的外键,例: // user 表 id name // ...
- svnkit 用java 操作 svn
官网 https://svnkit.com/ https://blog.csdn.net/Hui_hai/article/details/80318518 https://blog.csdn.net/ ...
- Cryptography -- 密码学
Introduction to Cryptography Cryptography enables you to store sensitive information or transmit it ...
- ASE —— 第一次结对作业
问题定义 游戏规则: N个玩家,每人写一个或两个0~100之间的有理数 (不包括0或100),提交给服务器,服务器在当前回合结束时算出所有数字的平均值,然后乘以0.618,得到G值. 提交的数字最靠近 ...
- Flutter——AspectRatio组件
AspectRatio 的作用是根据设置调整子元素 child 的宽高比. AspectRatio 首先会在布局限制条件允许的范围内尽可能的扩展,widget 的高度是由宽度和比率决定的,类似于 Bo ...
- golang使用sftp连接服务器远程上传、下载文件
安装github.com/pkg/sftp 我们之前介绍了,golang如何通过ssh连接服务器执行命令,下面我们来如何上传文件,上传文件同样需要之前的ssh,但是除此之外还需要一个模块,直接使用go ...
- Introduction of Machine Learning
李宏毅主页 台湾大学语音处理实验室 人工智慧.机器学习与深度学习间有什么区别? 人工智能——目标 机器学习——手段 深度学习——机器学习的一种方法 人类设定好的天生本能 Machine Learnin ...
- opengl 4.5 中文api 链接
https://www.cnblogs.com/wiki3d/p/opengl_a.html