Python2和Python3的编码区别

Python2和Python3的编码区别:

1:什么是字符串编码?

在计算机的世界,所有的数据本质上都由二进制表示

字符串编码:为了让人们能够读懂计算机数据,将计算机里的二进制数据,通过编码表对应,转换为人类可以看懂的字符

编码表历史:

1. 最早的计算机是美国人发明的,最开始设计编码表的时候,只考虑的美国的语言习惯(数据、字母和普通字符)0~127,出现了 ASCII 美国标准信息交换码

2. 后来计算机开始普及全球,由于0~127不够用了,各个国家开始指定自己的编码表(在ASCII表基础上进行扩展,表示前127个都是一样的),便有了欧洲 Latin-1、 中国简体中文 GB2312、繁体中文 Big5、日本Shift_JIS。

3. 由于导致各个国家的编码不统一,文化交流不方便,文本内容传输做编码转换很麻烦。

    于是国标组织指定了一个大一统的编码表:Unicode 万国码(给世界上每个字符,单独指定了一个二进制,再通过Unicode编码表转换)

    Unicode里每个字符占用4个字节(不够4个字节,前面补0),所以Unicode浪费空间。

    'a' == 00000000 00000000 00000000 01100001

4. 于是在Unicode基础上做了升级,UTF-8编码(可变长的Unicode),可以根据字符类型来指定字节空间(尽可能减少空间占用)

    在UTF-8里,一个字母1个字节,一个汉字3个字节 ; 在GBK里,一个字母1个字节,一个汉字2个字节(在简体中文处理GBK优于UTF-8)

5. UTF-8 也是当前世界上最流行的编码表处理方案,所有的Linux终端默认编码是UTF-8, 90%的网页都是UTF-8,简体中文的Windows终端默认编码是 GBK,也称为 CP936 (code page 936)

*乱码是指:显示指定编码的字符时,使用了其他的编码表(如简体中文Windows终端默认使用BGK编码,强行显示utf-8字符串是就会出现乱码)

2:python 字符串类型  和 编码 的关系?

python2 的字符串类型 和编码:

str 类型 是非Unicode编码(GBK,utf-8,jpg,mp4)

Unicode 类型字符串是Unicode编码

python3 的字符串类型和编码:

str类型字符串是Unicode编码

bytes 类型字符串是非Unicode编码(GBK,utf-8,jpg,mp4,mp3)

*3: 字符串编码转换

定律:任何操作系统、任何编程语言、任何编码字符串,都可以和Unicode互相转换。

例如:utf-8字符串转为GBK字符串​

1. 任何编码的字符串,都可以通过decode 解码为 Unicode字符串

        unicode_str = utf8_str.decode("utf-8")

2. Unicode字符串,可以通过 encode 编码为 指定编码字符串

    gbk_str = unicode_str.encode("gbk")​

反之亦然:

    unicode_str = gbk_str.decode("gbk")

utf8_str = unicode_str.encode("utf-8")

4:python解释器终端创建的字符串编码

python2的终端创建字符串,Windows是GBK编码,Linux是UTF-8编码(为str类型,非unicode编码)

ipython2里创建的字符串,统一为utf-8编码

python3的终端创建字符串,默认都是Unicode编码,为str类型(Unicode编码)

ipython3里创建的字符串,统一为Uncode编码

5:字符串默认写unicode 到文件的编码方式

**默认解释器编码:python2->ascii,python3->utf-8

    Python3:

        用 w 模式写入一个unicode字符串,保存到文件时,默认按解释器编码 (utf-8)进行编码转换,再写入文件中,所以文件编码是utf-8

        import sys

        sys.getdefaultencoding() # 查看当前Python3默认解释器编码,为utf-8

    with open("test.txt", "w") as f:

        f.write(unicode_str)

Python2:

    import sys

    sys.getdefaultencoding()  # 查看当前Python2默认解释器编码,为ascii

    用 w 模式写入一个unicode字符串,保存到文件时,默认按解释器编码 (ascii)进行编码转换,如果字符串里有中文等非ascii字符,无法将Unicode 按 ascii 编码处理,就会报出 UnicodeEncodeError

    with open("test.txt", "w") as f:

        f.write(unicode_str)

解决方案

1:将Python2的解释器编码,转为和Python3 一样的  utf-8

      import sys

    reload(sys)

      sys.setdefaultencoding("utf-8")

**字符串默认写Unicode到文件的方式(手动转码 、 文件encoding),可以不通过解释器编码转换处理(重点):

    Python3:

        1. 手动对字符串进行编码转换,wb 模式再写入文件

            with open("test.txt", "wb") as f:

                f.write(unicode_str.encode("gbk"))

        2. 通过 open() 方法的  encoding 参数指定编码写入:

            with opne("test.txt", "w", encoding="gbk") as f:

                f.write(unicode_str)

    Python2:

        1. 手动对字符串进行编码转换,wb/w 模式再写入文件

            with open("test2.txt", "wb") as f:

                f.write(unicode_str.encode("gbk"))

        2. 通过 codecs.open() 方法的  encoding 参数指定编码写入:

            import codecs

            with codecs.open("test.txt", "w", encoding="gbk") as f:

                f.write(unicode_str)

总结:python写入Unicode字符串到文件时,指定编码方案:

手动对Unicode字符串编码转换为非Unicode字符串,再写入非Unicode字符串

通过 open()方法的encoding参数指定编码,再写入Unicode字符串

如果没有手动编码也没有指定编码,则默认通过 解释器编码 默认转码处理,自动转码再写入文件

6:文件编码

    当写入一个字符串到文件时,文件编码等于该字符串的编码。

    如果写入了一个其他编码的字符串,会导致文件内容有乱码,而且无法得知之前的内容是什么。

注意:不要在同一个文件中,写入不同的编码字符串。

7:网页编码

/html/head/meta/charset 指定了该网页的字符编码

8:python代码文件头部申明

Python3 默认是 utf-8

Python2 默认是 ascii

所有需要手动指定为 utf-8

#coding:urf-8

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,427评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,551评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,747评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,939评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,955评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,737评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,448评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,352评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,834评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,992评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,133评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,815评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,477评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,022评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,147评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,398评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,077评论 2 355

推荐阅读更多精彩内容