python-字符编码
Posted jamie86
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python-字符编码相关的知识,希望对你有一定的参考价值。
什么是编码
明文到编码文本的转换称为“编码”,从编码文本又转回成明文则为“解码”
ASCII
ASCII编码:256种不同状态,每种状态就唯一对应一个字符,比如A--->00010001,而英文只有26个字符,算上一些特殊字符和数字,128个状态也够用了;每个电平称为一个比特位,约定8个比特位构成一个字节,这样计算机就可以用127个不同字节来存储英语的文字了。这就是
GB2312
ASCII对于中国来说产生一个问题,就是没办法识别中文,所以将ASCII编码重新写了一遍,也就是形成了对 ASCII 的中文扩展,大约可以支持7000多个简体汉字
GBK 和 GB18030编码
由于GB2312支持的中文数量有限,所以在GB2312的基础上进行了扩展,扩展之后的编码方案被称为 GBK 标准,而GBK 包括了 GB2312 的所有内容,同时又增加了近20000个新的汉字(包括繁体字)和符号
UNICODE编码
诸多编码产生之后,同样也引发了一个问题,就是各国语言之间的编码互不通用,计算机之间产生乱码现象,为了解决这个问题,国际标谁化组织对编码进行了统一,而统一之后的编码被称为unicode编码。
UNICODE是用两个字节来表示为一个字符,它总共可以组合出65535不同的字符,这足以覆盖世界上所有的语言和符号(包括甲骨文)。
例子:
变量: s="I‘m
苑昊"
unicode的方式(UCS-2)存储方式:
I 00000000 01001001
‘ 00000000 00100111
m 00000000 01101101
00000000 00100000
苑 10000010 11010001
昊 01100110 00001010
utf8
UTF-8(8-bit Unicode Transformation Format)是一种针对Unicode的可变长度字符编码,它可以使用1~4个字节表示一个符号,根据
不同的符号而变化字节长度,当字符在ASCII码的范围时,就用一个字节表示,所以是兼容ASCII编码的
Unicode是内存编码表示方案(是规范),而UTF是如何保存和传输Unicode的方案(是实现)这也是UTF与Unicode的区别。
例子:
变量:s="I‘m
苑昊"
UTF-8的存储方式:
I 01001001
‘ 00100111
m 01101101
00100000
苑 11101000 10001011 10010001
昊 11100110 10011000 10001010
必须要知道的知识点:
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
编码之间转换流程图:(仅适用于py2)
编码转换实例:
基于python2.x
import sys
print(sys.getdefaultencoding()) #打印系统默认的编码
msg = "嗨,宝宝"
msg_GB2312 = msg.decode("utf-8").encode("gb2312")
GB2312_to_GBK = msg_GB2312.decode("gbk").encode("gbk")
print(msg)
print(msg_GB2312)
print(GB2312_to_GBK)
基于Python3.x
import sys
print(sys.getdefaultencoding())
msg = "嗨,宝宝"
#msg_gb2312 = msg.decode("utf-8").encode("gb2312")
msg_GB2312 = msg.encode("gb2312") #系统默认就是unicode,不用再decode
GB2312_to_unicode = msg_gb2312.decode("gb2312")
GB2312_to_utf8 = msg_gb2312.decode("gb2312").encode("utf-8")
print(msg)
print(msg_GB2312)
print(GB2312_to_unicode)
print(GB2312_to_utf8)
以上是关于python-字符编码的主要内容,如果未能解决你的问题,请参考以下文章