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中的推导式使用详解
Jun 03 Python
Python获取邮件地址的方法
Jul 10 Python
python安装oracle扩展及数据库连接方法
Feb 21 Python
Python在图片中插入大量文字并且自动换行
Jan 02 Python
Python从文件中读取数据的方法讲解
Feb 14 Python
在python中画正态分布图像的实例
Jul 08 Python
Python 利用邮件系统完成远程控制电脑的实现(关机、重启等)
Nov 19 Python
从pandas一个单元格的字符串中提取字符串方式
Dec 17 Python
TensorFlow通过文件名/文件夹名获取标签,并加入队列的实现
Feb 17 Python
python 解决print数组/矩阵无法完整输出的问题
Feb 19 Python
python虚拟环境模块venv使用及示例
Mar 04 Python
python神经网络学习 使用Keras进行回归运算
May 04 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
snoopy 强大的PHP采集类使用实例代码
2010/12/09 PHP
YII Framework框架教程之安全方案详解
2016/03/14 PHP
PHP对象、模式与实践之高级特性分析
2016/12/08 PHP
PHP策略模式定义与用法示例
2017/07/27 PHP
Laravel框架实现修改登录和注册接口数据返回格式的方法
2018/08/17 PHP
33种Javascript 表格排序控件收集
2009/12/03 Javascript
Javascript面向对象设计一 工厂模式
2011/12/20 Javascript
JQuery+DIV自定义滚动条样式的具体实现
2013/06/25 Javascript
php常见的页面跳转方法汇总
2015/04/15 Javascript
jQuery获取页面及个元素高度、宽度的总结——超实用
2015/07/28 Javascript
jquery带下拉菜单和焦点图代码分享
2015/08/24 Javascript
JS实现仿微博可关闭弹出层效果
2015/09/21 Javascript
js创建jsonArray传输至后台及后台全面解析
2016/04/11 Javascript
使用JS批量选中功能实现更改数据库中的status状态值(批量展示)
2016/11/22 Javascript
使用get方式提交表单在地址栏里面不显示提交信息
2017/02/21 Javascript
js简单实现网页换肤功能
2017/04/07 Javascript
SpringMVC简单整合Angular2的示例
2017/07/31 Javascript
使用Vue的slot插槽分发父组件内容实现高度复用、更加灵活的组件(推荐)
2018/05/01 Javascript
微信小程序实现自上而下字幕滚动
2018/07/14 Javascript
详解小程序设置缓存并且不覆盖原有数据
2019/04/15 Javascript
详解微信小程序图片地扯转base64解决方案
2019/08/18 Javascript
layui table 多行删除(id获取)的方法
2019/09/12 Javascript
koa2的中间件功能及应用示例
2020/03/05 Javascript
jQuery弹框插件使用方法详解
2020/05/26 jQuery
Python脚本实时处理log文件的方法
2016/11/21 Python
Python 中 list 的各项操作技巧
2017/04/13 Python
Python实现计算图像RGB均值方式
2020/06/04 Python
对python中list的五种查找方法说明
2020/07/13 Python
新电JAVA笔试题目
2014/08/31 面试题
Prototype如何实现页面局部定时刷新
2013/08/06 面试题
学生个人总结范文
2015/02/15 职场文书
大客户经理岗位职责
2015/04/09 职场文书
62句有关感恩节文案(推荐收藏)
2019/11/28 职场文书
导游词之南昌滕王阁
2019/11/29 职场文书
手把手教你实现PyTorch的MNIST数据集
2021/06/28 Python
如何通过一篇文章了解Python中的生成器
2022/04/02 Python