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中无限元素列表的实现方法
Aug 18 Python
Python读取图片属性信息的实现方法
Sep 11 Python
Python竟能画这么漂亮的花,帅呆了(代码分享)
Nov 15 Python
PYTHON基础-时间日期处理小结
May 05 Python
Python实现的网页截图功能【PyQt4与selenium组件】
Jul 12 Python
python中嵌套函数的实操步骤
Feb 27 Python
python点击鼠标获取坐标(Graphics)
Aug 10 Python
Python IDLE或shell中切换路径的操作
Mar 09 Python
利用4行Python代码监测每一行程序的运行时间和空间消耗
Apr 22 Python
浅谈keras通过model.fit_generator训练模型(节省内存)
Jun 17 Python
python json.dumps() json.dump()的区别详解
Jul 14 Python
Pytorch框架实现mnist手写库识别(与tensorflow对比)
Jul 20 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
Get或Post提交值的非法数据处理
2006/10/09 PHP
可以在线执行PHP代码包装修正版
2008/03/15 PHP
合并ThinkPHP配置文件以消除代码冗余的实现方法
2014/07/22 PHP
PHP通过微信跳转的Code参数获取用户的openid(关键代码)
2016/07/06 PHP
PHP中ajax无刷新上传图片与图片下载功能
2017/02/21 PHP
使用JS操作页面表格,元素的一些技巧
2007/02/02 Javascript
Prototype的Class.create函数解析
2011/09/22 Javascript
JS实现仿FLASH效果的竖排导航代码
2015/09/15 Javascript
学习javascript面向对象 javascript实现继承的方式
2016/01/04 Javascript
JS模态窗口返回值兼容问题的完美解决方法
2016/05/28 Javascript
bootstrap table小案例
2016/10/21 Javascript
Javascript中字符串和数字的操作方法整理
2017/01/22 Javascript
解决IE7中使用jQuery动态操作name问题
2017/08/28 jQuery
Vue.js递归组件实现组织架构树和选人功能案例分析
2019/07/03 Javascript
使用vue for时为什么要key【推荐】
2019/07/11 Javascript
Vue循环中多个input绑定指定v-model实例
2020/08/31 Javascript
简单实现python聊天程序
2018/04/01 Python
Python基于xlrd模块操作Excel的方法示例
2018/06/21 Python
python用pandas数据加载、存储与文件格式的实例
2018/12/07 Python
对Python3之进程池与回调函数的实例详解
2019/01/22 Python
python使用wxpy实现微信消息防撤回脚本
2019/04/29 Python
详细整理python 字符串(str)与列表(list)以及数组(array)之间的转换方法
2019/08/30 Python
浅谈Python中os模块及shutil模块的常规操作
2020/04/03 Python
使用Python FastAPI构建Web服务的实现
2020/06/08 Python
俄罗斯运动鞋商店:Sneakerhead
2018/05/10 全球购物
AP澳洲中文网:澳洲正品直邮,包税收件无忧
2019/07/12 全球购物
俄罗斯第一家篮球店:StreetBall
2020/07/30 全球购物
几个SQL的面试题
2014/03/08 面试题
一套比较完整的软件测试人员面试题
2012/05/13 面试题
DELPHI面试题研发笔试试卷
2015/11/08 面试题
品管员岗位职责
2013/11/10 职场文书
导游个人求职信
2014/04/25 职场文书
关爱老人标语
2014/06/21 职场文书
关于社会实践的心得体会(2016最新版)
2016/01/25 职场文书
Python+Appium实现自动抢微信红包
2021/05/21 Python
SQL Server作业失败:无法确定所有者是否有服务器访问权限的解决方法
2021/06/30 SQL Server