Python2.7编解码问题总结

最近颇受编码问题困扰,所以稍作总结,附以代码说明

  1. 为什么需要编解码?
    字符串以unicode的形式存在于内存中 ,但是unicode只是规定如何编码,并没有规定如何保存、传输这个编码,也就是说unicode不能直接写入文件或者在网络上传输,所以得通过某种编码使unicode变成连续的字节(bytes),同样地,对读入的数据解码,以unicode形式存在于内存中.
    举例来说,在写python时,python语言处理的字符串就是内存中的unicode,写入到文件时得把unicode用utf-8,GBK等方式编码成连续的字节;用python从文件读入数据时,得用utf-8,GBK等方式把连续的字节解码成unicode.使用的解码方式务必要和编码方式一致

  2. python默认的编解码方式
    可以通过下面两行代码 (示例1) 获得,一般默认是ascii,本示例中就是对unicode用ascii编码为字符串,ascii不能表示汉字,所以输入汉字时就会报错 (示例2)

        #示例1
        import sys
        print sys.getdefaultencoding()  
        #ascii
        
        #示例2
        print "搁浅"
        #SyntaxError: Non-ASCII character
    
  3. 如何print汉字?
    情况一: 在python中直接输入中文 (示例3)
    得让python文件支持中文,将python文件的编码格式改为utf-8,就是我们通常看到的 # -*- coding:utf-8 -*-

        #示例3
        # -*- coding:utf-8 -*-
        print "搁浅"  
    

    情况二: print指定编码的中文 (示例4)
    示例4报错,因为在对"搁浅"encode之前,先需要把"搁浅"解码成unicode,之后再用utf-8编码,那么问题来了,怎么解码"搁浅" ? 获取python的默认编解码方式 (示例5),一般是ascii,所以会报错,将默认编解码方式设置成utf-8后就可以了 (示例6)

        #示例4
        # -*- coding:utf-8 -*-
        a = "搁浅".encode("utf-8")
    
        #示例5
        import sys
        print sys.getdefaultencoding()  
    
        #示例6
        import sys
        reload(sys)
        sys.setdefaultencoding("utf-8")
        print "搁浅".encode("utf-8")
    
  4. python以十六进制显示非打印字符,"搁浅"这两个字的16进制编码分别是:69081,6B585
    在python内部为:\xe6\x90\x81\xe6\xb5\x85 (示例7),其中,\x表示十六进制 ,e表示某个字符编码的开始

        #示例7
        # -*- coding:utf-8 -*-
        #打印s在python内部的存在形式
        s = ["搁浅"]
        print s
    
  5. 乱码
    print出乱码极可能是因为编码与解码方式不统一 (示例8).utf-8编码,每个汉字用utf-8编码需要3个字节,用gbk编码需要2个字节. 用utf-8编码后解码,再用gbk编码,造成这样的问题:本该用3个字节表示的字符,强行用2个字节表示(示例9)

        #示例8
        # -*- coding:utf-8 -*-
        s = ["搁浅"]
        print "搁浅".decode("utf-8").encode("gbk")
        #打印乱码:��dz
    
        #示例9
        s = ["搁浅"]
        print s
        #输出:["\xe6\x90\x81\xe6\xb5\x85"]    每个汉字3个字节
        s = ["搁浅".decode("utf-8").encode("gbk")]
        print s
        #输出:["\xb8\xe9\xc7\xb3"]    每个汉字2个字节
    
  6. 有待确认
    python默认解码方式是ascii;
    python源代码加上# -*- coding:utf-8 -*-后,不仅仅是源代码支持中文,而且print的默认编码方式也变成utf-8

推荐一个查看字符编码的网页,很好用,可以查看编码10进制, 编码16进制,Unicode编码10进制,Unicode编码16进制,python用的是 编码16进制

编码问题时不时出来阻挠一下,需要继续补充总结

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

推荐阅读更多精彩内容