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-字符编码的主要内容,如果未能解决你的问题,请参考以下文章

如何测试文本片段是不是是 Quoted-printable 编码的

Python 必知的 20 个骚操作!

python+spark程序代码片段

python编码与代码注释

Python代码阅读(第25篇):将多行字符串拆分成列表

Python string中删除(过滤)掉emoji表情字符