字符编码:python 详解

字符编码:

    一、字符编码的历史:

        # 纸带打孔机 编程

        # 汇编语言+机器语言

        # C、lisp、Fortran -- Python C++ Java

        基本点:计算机里所有数据存储、计算,都是通过二进制处理。

        二进制: 0b01100001

        十进制: int(0b0110001) -> 97

        字符: chr(97) -> 'a'

        ASCII表:美国标准信息交换码,只能表示常用的字母、数字和普通符号, 0~127之间,一个字符 占 1 个字节。

        latin-1: 在ASCII基础上扩展了127个,包含了西方文字,德文、法文...

        gb2312: 在ASCII基础上进行扩展,可以表示简体中文(gb2312->gbk->gb18030),一个汉字 2 个字节

        Big5 : 在ASCII基础上进行扩展,表示繁体中文..

        shift-jis : 在ASCII基础上进行扩展,日文..

        几乎每个国家都有自己的编码表,导致文字交流不方便。

        注意:如果输出字符时,没有对应的编码表支持,就会出现"乱码"。

        为了解决编码不一致的问题,国际标准组织制定了一套新的编码 Unicode,给全世界每一个字符单独指定了一个新的二进制方式。

        但是Unicode有个缺点,每个字符占用 3~4个字节,比较浪费空间。

        于是在Unicode基础上进行了升级更新: utf-8 编码(可变长的Unicode),一个字母占1个字节,一个汉字占3个字节。

        所以utf-8现在是世界上最流行应用最广泛的编码,90%以上的网页字符编码 默认为 utf-8,所有的Linux终端编码默认是utf-8

        简体中文Windows 终端默认编码是 gbk,但是可以通过 chcp 65001 修改为 utf-8

    二、Python中的字符编码和类型对比:

        Python3 中:

            Unicode编码字符串,是 str 类型

            非Unicode编码字符串,是 bytes 类型

        Python2 中(了解):

            Unicode编码字符串,是 unicode 类型

            非Unicode编码字符串, 是 str 类型

        编码统一处理口诀:任何操作系统下的任何编程语言的任何编码,都可以和Unicode互相转换。

            utf8_str  --> gbk_str

            # 对 utf-8 字符串按自身编码进行解码,返回 Unicode字符串

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

            # 对 Unicode字符串 按指定编码进行编码,返回 编码后的字符串

            gbk_str = unicode_str.encode("gbk")

    三、Python爬虫程序需要处理的编码场景:

        1. 发送请求,获取网页字符串(不同的网页,字符串编码可能不一样,编码统一)

        2. 数据解析过程中,需要处理的字符串编码(编码统一)

        3. 将字符串保存到文件、数据库时(编码统一)

    四、在python解释器 终端里创建字符串的编码:

        Python3:Unicode编码


        Python2:根据操作系统,简体中文Windows -gbk, Linux - utf-8

            iPython2里, 全部统一为 utf-8

    五、在Python代码文件里创建的字符串编码:

        Python3:Unicode编码


        Python2:根据操作系统,简体中文Windows - gbk, Linux - utf-8

            iPython2里, 全部统一为 utf-8

    六:代码文件头部编码声明:

        Python3 的代码文件的文字,按utf-8保存


        Python2 的代码文件文字,默认按 ascii 保存,所以需要手动声明按 utf-8 保存代码文字

        # -*- coding:utf-8 -*-

        表示python代码文件里面文字按 utf-8 保存

    七、网页字符串编码:

        /html/head/meta/charset 指定的当前网页的编码,通过requests模块获取的网页字符串,就是该编码的字符串。

    八、将 Unicode字符串数据 保存到文件中方法:

        1. 在保存Unicode字符串时,手动编码转换再写入(这种方式不会触发解释器编码默认转换)

            Python3:

                unicode_str = "你好"

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

                    f.write(unicode_str.encode("utf-8"))

            Python2:

                unicode_str = u"你好"

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

                    f.write(unicode_str.encode("utf-8"))


        2. 在保存Unicode字符串时,通过 open()方法的 encoding 参数指定编码(这种方式不会触发解释器编码默认转换)

            Python3:

                unicode_str = "你好"

                with open("test.txt", "w", encoding="utf-8") as f:

                    f.write(unicode_str)

            Python2:

                Python2的 open() 方法默认没有encoding参数,但是可以通过 codecs 模块支持。


                import codecs

                unicode_str = "你好"

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

                    f.write(unicode_str)

        3. 直接保存Unicode字符串到文件中,如果 既没有通过encode编码,也没有通过encoding参数指定编码,则触发解释器编码默认转换。

                Python会按照默认的解释器编码进行转码处理,再写入文件。


            Python3:可以直接写入Unicode到本地文件,默认文件编码为 utf-8,因为Python3的解释器编码是 utf-8


                unicode_str = "你好"

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

                    f.write(unicode_str)

            Python2:可以直接写入Unicode到本地文件,可能会报出 UnicodeEncodeError,因为Python2的解释器编码默认是 ascii

                    只能对普通英文字母、数字和字符进行编码转换,如果Unicode里有中文,则编码失败(因为 ascii 不支持处理中文)


                # 解决方案:将Python2的解释器编码修改为 utf-8,这样就可以写入任意的Unicode字符串

                import sys

                reload(sys)

                sys.setdefaultencoding("utf-8")


                unicode_str = u"你好"

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

                    f.write(unicode_str)

    九、文件编码:

        1. 当第一次写入一个字符串到文件中时,该文件编码等同于字符串编码

        2. 当第二次写入的字符串编码,和第一次写入字符串编码不一致时,文件编码被会修改,会导致之前的数据全部变成乱码。

        记住:不要在同一个文件中,写入不同编码的字符串。一定要做编码统一。

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

推荐阅读更多精彩内容