python 字符编码与转换

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

下面请看一张图

将字符串转换为gbk

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

执行输出

b'\xc4\xfa\xba\xc3'

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

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

查看gbk和utf-8的区别

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

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()方法,传一个参数,将要转换的编码是什么。

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

# coding: gbk

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

# 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步

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类型之间的相互转换。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏极客编程

ECMAScript 6教程 (三) Class和Module(类和模块)

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出 原文连接,博客地址为 http://www.cnblogs.co...

923
来自专栏星回的实验室

js重修课[二]:表达式和运算符

941
来自专栏LuckQI

Redis初识~List命令

1012
来自专栏华章科技

Python 3 入门,看这篇就够了

链接:https://shockerli.net/post/python-study-note/

3496
来自专栏互联网杂技

详解JavaScript变量、作用域及内存

基本类型值有:undefined,NUll,Boolean,Number和String,这些类型分别在内存中占有固定的大小空间,他们的值保存在栈空间,我们通过按...

3628
来自专栏程序员的知识天地

python超详细的基础笔记,你还在苦恼怎么学吗?

python是一种面向对象的解释型计算机程序设计语言,python的是吉多·范罗苏姆(Guido van Rossum)于1989年发明

1083
来自专栏Java成长之路

动态代理详解

代理 是常用的基本设计模式之一,在某些情况下,一个客户不想或者不能直接引用一个对 象,此时可以通过一个称之为“代理”的第三者来实现 间接引用。代理对象可以在客户...

801
来自专栏Java帮帮-微信公众号-技术文章全总结

【选择题】Java基础测试三(15道)

【选择题】Java基础测试三(15道) 26.关于以下程序代码的说明正确的是( D ) 1.class HasStatic{ 2. privat...

3837
来自专栏前端布道

JavaScript之Promise对象

Promise 是异步编程的一种解决方案,比传统的解决方案——回调函数和事件——更合理和更强大。它由社区最早提出和实现,ES6 将其写进了语言标准,统一了用法,...

1083
来自专栏Python入门

python超详细的基础笔记你学会了么

python是一种面向对象的解释型计算机程序设计语言,python的是吉多·范罗苏姆(Guido van Rossum)于1989年发明

1072

扫码关注云+社区