Python字符编码转码之GBK,UTF8互转


Posted in Python onFebruary 09, 2020

一、Python字符编码介绍

1、须知:

在python 2中默认编码是 ASCII,而在python 3中默认编码是 unicode

unicode 分为utf-32 (占4个字节),utf-16(占两个字节),utf-8(占1-4个字节),所以utf-16 是最常用的unicode版本,但是在文件里存的还是utf-8,因为utf8省空间

在python 3,encode编码的同时会把stringl变成bytes类型,decode解码的同时会把bytes类型变成string类型

在unicode编码中 1个中文字符=2个字节,1个英文字符 = 1个字节,切记:ASCII是不能存中文字符的

utf-8是可变长字符编码,它是unicode的优化,所有的英文字符依然按ASCII形式存储,所有的中文字符统一是3个字节

unicode包含了所有国家的字符编码,不同字符编码之间的转换都需要经过unicode的过程

python本身的默认编码是utf-8

2、py2中的编码和转码的过程,如图:

Python字符编码转码之GBK,UTF8互转

注:因为unicode是中间编码,任何字符编码之前的转换都必须解码成unicode,在编码成需要转的字符编码

二、字符编码的转换

1、py2字符编码的转换,代码如下:

#! /usr/bin/env python
# -*- coding:utf-8 -*-
# __auther__ == luoahong
 
s = "我是学员"
#utf-8解码成unicode编码
s_to_unicode = s.decode("utf-8")
print("--------s_to_unicode-----")
print(s_to_unicode)
#然后unicode再编码成gbk
s_to_gbk = s_to_unicode.encode("gbk")
print("-----s_to_gbk------")
print(s_to_gbk)
#gbk解码成unicode再编码成utf-8
gbk_to_utf8 = s_to_gbk.decode("gbk").encode("utf-8")
print("------gbk_to_utf8-----")
print(gbk_to_utf8)
 
#输出
--------s_to_unicode-----
我是学员
-----s_to_gbk------
�����˧
------gbk_to_utf8-----
我是学员

 注:以上这种情况适合字符是非unicode编码请款下,但是如果字符编码已经是Unicode的了咋办呢?广告回来,更加精彩。。。。。

2、字符编码已经是unicode情况下,代码如下:

#! /usr/bin/env python
# -*- coding:utf-8 -*-
# __auther__ == luoahong
 
#u代码字符编码是unicode
s = u'你好'
#已经是unicode,所以这边直接是编码成gbk
s_to_gbk = s.encode("gbk")
print("----s_to_gbk----")
print(s_to_gbk)
#这边再解码成unicode然后再编码成utf-8
gbk_to_utf8 = s_to_gbk.decode("gbk").encode("utf-8")
print("-----gbk_to_utf8---")
print(gbk_to_utf8)
#输出
----s_to_gbk----
���
-----gbk_to_utf8---
你好

注:在python2中,在文件的开头指定字符编码,是要告诉解释器我现在的字符编码使用的是utf-8,那我在打印的中文时候,那么在utf-8中包含中文字符,那么可以打印出来。那么如果你不制定字符编码,默认使用系统编码,如果你的系统编码是ASCII,那么就会报错,因为ASCII不能存中文字符。

3、py3的字符编码转换

在须知中已经说到python 3的编码,默认是unicode,所以字符编码之间的转换不需要decode过程,直接encode即可,代码如下:

#! /usr/bin/env python
# __auther__ == luoahong
#无需声明字符编码,当然你声明也不会报错
 
s = '你好'
# 字符串s已经是unicode编码,无需decode,直接encode
s_to_gbk = s.encode("gbk")
print("----s_to_gbk----")
print(s_to_gbk)
#这边还是一样,gbk需要先解码成unicode,再编码成utf-8
gbk_to_utf8 = s_to_gbk.decode("gbk").encode("utf-8")
print("-----gbk_to_utf8---")
print(gbk_to_utf8)
#解码成unicode字符编码
utf8_decode = gbk_to_utf8.decode("utf-8")
print("-------utf8_decode----")
print(utf8_decode)
 
#输出
----s_to_gbk----
b'\xc4\xe3\xba\xc3'
-----gbk_to_utf8---
b'\xe4\xbd\xa0\xe5\xa5\xbd'
-------utf8_decode----
你好

 注:在python 3,encode编码的同时会把stringl变成bytes类型,decode解码的同时会把bytes类型变成string类型,所以你就不难看出encode后的把它变成了一个bytes类型的数据。还有需要特别注意的是:不管是否在python 3的文件开头申明字符编码,只能表示,这个python文件是这个字符编码,文件中的字符串还是unicode,如下图:

三、总结:

1、uniocode能识别所有字符编码的字符串

2、在python 2中,字符编码之间的转化需要通过unicode才能转换,所以打印时,可以是使用unicode,也可以使用对应的字符编码(文件开头指定编码),打印字符或者字符串,因为py2中没有对字符和字节做明显区分,       所以才混导致这样的结果。

3、在python 3中,只有通过Unicode去识别字符的,如果转成编码成对应编码格式了,就直接变成对应编码的bytes类型的字节码,也就是二进制,需要识别,必须解码成Unicode才能识别

更多关于Python字符编码转码问题请查看下面的相关链接

Python 相关文章推荐
Python中用pycurl监控http响应时间脚本分享
Feb 02 Python
Python调用命令行进度条的方法
May 05 Python
简单总结Python中序列与字典的相同和不同之处
Jan 19 Python
Python利用ORM控制MongoDB(MongoEngine)的步骤全纪录
Sep 13 Python
python将txt等文件中的数据读为numpy数组的方法
Dec 22 Python
Django框架模板介绍
Jan 15 Python
python自定义函数实现一个数的三次方计算方法
Jan 20 Python
python获取微信企业号打卡数据并生成windows计划任务
Apr 30 Python
Gauss-Seidel迭代算法的Python实现详解
Jun 29 Python
python迭代器常见用法实例分析
Nov 22 Python
浅谈Pycharm最有必要改的几个默认设置项
Feb 14 Python
Python中私有属性的定义方式
Mar 05 Python
Python基础之字符串操作常用函数集合
Feb 09 #Python
python连接PostgreSQL过程解析
Feb 09 #Python
Python +Selenium解决图片验证码登录或注册问题(推荐)
Feb 09 #Python
python+selenium定时爬取丁香园的新型冠状病毒数据并制作出类似的地图(部署到云服务器)
Feb 09 #Python
python 爬取疫情数据的源码
Feb 09 #Python
python代码如何实现余弦相似性计算
Feb 09 #Python
python字符串替换re.sub()实例解析
Feb 09 #Python
You might like
php 无法加载mcrypt.dll的解决办法
2013/04/03 PHP
PHP导航下拉菜单的实现如此简单
2013/09/22 PHP
Destoon模板制作简明教程
2014/06/20 PHP
php实现页面纯静态的实例代码
2017/06/21 PHP
yii2学习教程之5种内置行为类详解
2017/08/03 PHP
PHP实现的用户注册表单验证功能简单示例
2019/02/25 PHP
一个可以兼容IE FF的加为首页与加入收藏实现代码
2009/11/02 Javascript
在vs2010中调试javascript代码方法
2011/02/11 Javascript
JS高级笔记
2011/07/13 Javascript
iframe异步加载实现点击左边菜单加载右边内容实例讲解
2013/03/04 Javascript
纯js实现重发验证码按钮倒数功能
2015/04/21 Javascript
不定义JQuery插件 不要说会JQuery
2016/03/07 Javascript
jQuery点击输入框显示验证码图片
2016/05/19 Javascript
chrome浏览器如何断点调试异步加载的JS
2016/09/05 Javascript
jquery实现自定义图片裁剪功能【推荐】
2017/03/08 Javascript
js使用highlight.js高亮你的代码
2017/08/18 Javascript
node.js基于fs模块对系统文件及目录进行读写操作的方法详解
2017/11/10 Javascript
集成vue到jquery/bootstrap项目的方法
2018/02/10 jQuery
解决koa2 ctx.render is not a function报错问题
2018/08/07 Javascript
小程序实现人脸识别功能(百度ai)
2018/12/23 Javascript
js的对象与函数详解
2019/01/21 Javascript
jQuery 函数实例分析【函数声明、函数表达式、匿名函数等】
2020/05/19 jQuery
[03:20]2015国际邀请赛全明星表演赛
2015/08/08 DOTA
举例讲解Python中metaclass元类的创建与使用
2016/06/30 Python
jupyter修改文件名方式(TensorFlow)
2020/04/21 Python
Python中三维坐标空间绘制的实现
2020/09/22 Python
公司捐款倡议书
2014/05/14 职场文书
信用社竞聘演讲稿
2014/05/16 职场文书
中华美德颂演讲稿
2014/05/20 职场文书
2014年医院后勤工作总结
2014/12/06 职场文书
优秀教育工作者事迹材料
2014/12/24 职场文书
图书借阅制度范本
2015/08/06 职场文书
创业计划书之熟食店
2019/10/16 职场文书
基于Python的EasyGUI学习实践
2021/05/07 Python
python实现简易自习室座位预约系统
2021/06/30 Python
请求模块urllib之PYTHON爬虫的基本使用
2022/04/08 Python