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将MongoDB里的ObjectId转换为时间戳的方法
Mar 13 Python
初步解析Python中的yield函数的用法
Apr 03 Python
python字典get()方法用法分析
Apr 17 Python
Python使用当前时间、随机数产生一个唯一数字的方法
Sep 18 Python
深入浅析Python中list的复制及深拷贝与浅拷贝
Sep 03 Python
解决sublime+python3无法输出中文的问题
Dec 12 Python
python自定义函数实现一个数的三次方计算方法
Jan 20 Python
解决Python中定时任务线程无法自动退出的问题
Feb 18 Python
使用Python制作缩放自如的圣诞老人(圣诞树)
Dec 25 Python
tensorflow-gpu安装的常见问题及解决方案
Jan 20 Python
Python单链表原理与实现方法详解
Feb 22 Python
python爬取股票最新数据并用excel绘制树状图的示例
Mar 01 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
DOTA2【瓜皮时刻】Vol.91 RTZ山史最惨“矿难”
2021/03/05 DOTA
xml+php动态载入与分页
2006/10/09 PHP
动态加载iframe
2006/06/16 Javascript
再次更新!MSClass (Class Of Marquee Scroll通用不间断滚动JS封装类 Ver 1.6)
2007/02/05 Javascript
利用JS重写Cognos右键菜单的实现代码
2010/04/11 Javascript
js 获取、清空input type="file"的值示例代码
2014/02/19 Javascript
Javascript排序算法之合并排序(归并排序)的2个例子
2014/04/04 Javascript
jQuery实现提交按钮点击后变成正在处理字样并禁止点击的方法
2015/03/24 Javascript
原生态js,鼠标按下后,经过了那些单元格的简单实例
2016/08/11 Javascript
js窗口震动小程序分享
2016/11/28 Javascript
原生js实现弹出层登录拖拽功能
2016/12/05 Javascript
JavaScript中BOM对象原理与用法分析
2019/07/09 Javascript
VUE前后端学习tab写法实例
2019/08/06 Javascript
uni-app实现点赞评论功能
2019/11/25 Javascript
[03:49]DOTA2英雄基础教程 光之守卫
2014/01/14 DOTA
[38:44]DOTA2上海特级锦标赛A组小组赛#2 Secret VS CDEC第二局
2016/02/25 DOTA
使用Python保存网页上的图片或者保存页面为截图
2016/03/05 Python
python变量的存储原理详解
2019/07/10 Python
新西兰珠宝品牌:Michael Hill
2017/09/16 全球购物
美国专业汽车音响和移动电子产品零售商:Car Toys
2019/05/13 全球购物
某/etc/fstab文件中的某行如下: /dev/had5 /mnt/dosdata msdos defaults,usrquota 1 2 请解释其含义
2013/04/11 面试题
计算机应用毕业生自荐信
2013/10/23 职场文书
导师评语大全
2014/04/26 职场文书
文明礼仪演讲稿
2014/05/12 职场文书
小学生差生评语
2014/12/29 职场文书
情人节活动总结范文
2015/02/05 职场文书
2015年前台个人工作总结
2015/04/03 职场文书
2015年班主任德育工作总结
2015/05/21 职场文书
2015年审计人员工作总结
2015/05/26 职场文书
爱的教育观后感
2015/06/17 职场文书
校园音乐节目广播稿
2015/08/19 职场文书
信息技术国培研修日志
2015/11/13 职场文书
2016暑期社会实践新闻稿
2015/11/25 职场文书
《春酒》教学反思
2016/02/22 职场文书
MySQL 全文索引使用指南
2021/05/25 MySQL
撤回我也能看到!教你用Python制作微信防撤回脚本
2021/06/11 Python