前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >python 字符编码与转换

python 字符编码与转换

作者头像
py3study
发布2018-08-02 15:58:59
1.5K0
发布2018-08-02 15:58:59
举报
文章被收录于专栏:python3

unicode 中文英文默认统一 2个字节

ASCII 只有英文和特殊字符 每个占用1个字节 不能存中文

每个字节由8个比特(Bit)构成

假如一个英文文档是2M,转换为unicode 编码转换,就变成了4M

为了解决空间浪费的问题,在unicode的基础上,出现了一个扩展集,叫UTF-8

UTF-8编码是可变长编码。默认所有英文字母按照ASCII的形式去存储。

所有中文字符,统一是3个字节

英文和特殊字符,依然是1个字节

unicode是万国编码,任何国家都可以使用。每个国家,编码都不一样的。

比如一款游戏《大话西游》用的是gbk编码开发的。出口到欧美国家,是无法直接运行的。

怎么办呢?把gbk转换为unicode就可以解决这个问题了。

关于字符编码与转码

请参考详细文章:

http://www.cnblogs.com/luotianshuai/articles/5735051.html

http://www.diveintopython3.net/strings.html

需知:

1.在python2默认编码是ASCII, python3里默认是unicode

2.unicode 分为 utf-32(占4个字节),utf-16(占两个字节),utf-8(占1-4个字节), so utf-16就是现在最常用的unicode版本, 不过在文件里存的还是utf-8,因为utf8省空间

3.在py3中encode,在转码的同时还会把string 变成bytes类型,decode在解码的同时还会把bytes变回string

下面请看一张图

blob.png
blob.png

将字符串转换为gbk

代码语言:javascript
复制
s = "您好"
print(s.encode("gbk"))

执行输出

b'\xc4\xfa\xba\xc3'

可以看到输出最前面有一个b 表示这是一个二进制类型,也称之为bytes类型

那么encode("gbk"),不光是转换了编码,还转换成了二进制数据

查看gbk和utf-8的区别

代码语言:javascript
复制
import sys
#打印默认编码
print(sys.getdefaultencoding())

s = "您好"
s_gbk = s.encode("gbk")
#打印gbk
print(s_gbk)
#打印utf-8,encode()默认使用utf-8
print(s.encode())

执行输出

utf-8

b'\xc4\xfa\xba\xc3'

b'\xe6\x82\xa8\xe5\xa5\xbd'

将gbk转换为utf-8

代码语言:javascript
复制
import sys
#打印默认编码
print(sys.getdefaultencoding())

s = "您好"
s_gbk = s.encode("gbk")
print(s_gbk)
print(s.encode())

gbk_to_utf8 = s_gbk.decode("gbk").encode("utf-8")
print("utf8",gbk_to_utf8)

执行输出

utf-8

b'\xc4\xfa\xba\xc3'

b'\xe6\x82\xa8\xe5\xa5\xbd'

utf8 b'\xe6\x82\xa8\xe5\xa5\xbd'

发现转换之后,和上面的utf-8,是一模一样的。

上面的大图显示

gbk转换为utf8,需要2步

1.首先通过编码【decode】转换为unicode编码

2.然后通过解码【encode】转换为utf-8的编码

总结:

不同编码之间的转换,必须要先转换为unicode编码。

先执行decode()方法,传一个参数,告诉它,我是什么编码。

最后执行encode()方法,传一个参数,将要转换的编码是什么。

以下代码表示,声明文件编码为

代码语言:javascript
复制
# coding: gbk

在python 里面,默认声明的变量是utf-8

代码语言:javascript
复制
# coding: gbk
import sys
#打印默认编码
print(sys.getdefaultencoding())

s = "您好"
s_gbk = s.encode("gbk")
print(s_gbk)

程序执行

utf-8

b'\xc4\xfa\xba\xc3'

如果想要转换的gbk,能够正常显示

需要执行4步

代码语言:javascript
复制
print(s.encode("utf-8").decode("utf-8").encode("gbk").decode("gbk"))

这一段代码就可以正常输出中文

由于s变量,默认就是utf-8编码,不能直接使用decode()方法。

需要先执行encode("utf-8"),再执行decode("utf-8")

再执行encode("gbk"),输出

b'\xc4\xfa\xba\xc3' 由于它是一个bytes类型,需要转换为字符串,所以最后执行decode("gbk")

得到中文 您好

编码之间的转换,需要2个步骤。先decode(),再encode().

转换完成之后,数据是bytes类型的,比较恶心啊。

如果需要正常显示,得decode()一下,才能正常显示。

注意,这里是decode()是指bytes类型与string类型之间的相互转换。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018/02/25 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档