• python 中文编码问题


    一、str对象

    a='xe5x93x88xe5x93x88' #字节串本身编码形式
    a='哈哈'# 脚本环境编码形式
    a='u54c8u54c8'# unicode_escape编码形式

    str记录的是字节数组(某种编码的存储格式),至于输出到文件或是打印出来是什么格式,完全取决于其解码的编码将它解码成什么样子。
    print语句将要输出的内容传给操作系统,操作系统根据系统的编码对输入的字节流进行编码,这就解释了为什么utf-8格式的字符串“哈哈”,输出的是“鍝堝搱”,因为'xe5x93x88xe5x93x88'用GBK去解释,其显示的出来就是“鍝堝搱”。

    二、unicode对象

    a=u'u54c8u54c8'
    a=u'啊'
    a=u'xb0xa1'

    当将一个unicode对象传给print时,在内部会将该unicode对象进行一次转换,转换成本地的默认编码(这仅是个人猜测)

    三、str和unicode对象的转换
    str--->unicode
    str.decode('utf-8')

    unicode--->str
    unicode.encode('utf-8')

    在python中str和unicode在编码和解码过程中,如果将一个str直接编码成另一种编码,会先把str解码成unicode,采用的编码为默认编码,一般默认编码是anscii,所以在上面示例代码中第一次转换的时候会出错,当设定当前默认编码为'gbk'后,就不会出错了。
    1. 对于控制台操作,只需要依次执行一下代码即可:
    import sys
    reload(sys)
    sys.setdefaultencoding('gbk')
    2. 对于脚本文件,可以在文件头书写特定编码:
    # coding = gbk

    # -*- coding: gbk -*-
    也可以在Configure IDLE中设置Default Source Encoding默认编码
    当脚本中存在编码声明时,文件保存格式编码(Default Source Encoding)失效;否则,反之。

    实例1 'xe5x93x88xe5x93x88'形式(UTF-8编码)显示中文

    a='xe5x93x88xe5x93x88'# utf-8编码形式
    print(a.decode('utf-8'))

    这里直接使用print(a)会调用系统默认编码(GBK)对输入的字节流进行编码,而这里的a是UTF-8编码的,所以会报错;而如果a是系统编码(GB2312或GBK)的形式,如:
    a='xb9xfexb9xfe'# GB2312或GBK编码形式
    print(a)

    直接使用print(a)就没问题了

    如果操作文件或网页打印出来的是这种形式的,使用其编码解码就是了

    实例2 '哈哈'形式显示中文

    a='哈哈'
    IDLE中:print(a)
    脚本中:print(a.decode('utf-8'))# utf-8脚本编码

    这里会调用脚本或IDLE默认编码对其编码、解码。
    如果脚本编码为GBK或GB2312则可以直接使用:
    print(a)


    实例3 'u54c8u54c8'形式显示中文

    a='u54c8u54c8'
    print(a.decode('unicode_escape'))

    这里a是str字节串,只是其中包含unicode码,使用unicode_escape解码就是了

    实例4 u'u54c8u54c8'

    a=u'u54c8u54c8'
    print(a)

    直接使用print(a)

    实例5 u'xe5x93x88xe5x93x88'形式

    a=u'xe5x93x88xe5x93x88'# utf-8编码
    print(a.encode('raw_unicode_escape').decode('utf-8'))


    其实,a.encode('raw_unicode_escape')将其转换为'xe5x93x88xe5x93x88',同实例1:
    这里直接使用print('xe5x93x88xe5x93x88')会调用系统默认编码(GBK)对输入的字节流进行编码,而如果a是GB2312或GBK编码的,直接print即可。如:

    c=u'xb9xfexb9xfe'# gbk编码形式
    print(c.encode('raw_unicode_escape'))

    实例6 u'哈哈'形式

    a=u'哈哈'
    IDLE中:print(a.encode('raw_unicode_escape'))
    脚本中:print(a)

    存储形式为u'u554a'(脚本:参照实例4)或u'xb0xa1'(IDLE:参照实例5)。

  • 相关阅读:
    docker的网络服务
    想真正了解JAVA设计模式看着一篇就够了。 详解+代码实例
    再问你Java内存模型的时候别再给我讲堆栈方法区
    ssh爆破脚本
    ecshop3.0.0注入
    zabbix 安装配置以及漏洞检测脚本
    代理爬取
    selenium2使用记录
    初级AD域渗透系列
    用ftplib爆破FTP口令
  • 原文地址:https://www.cnblogs.com/doudongchun/p/3693784.html
Copyright © 2020-2023  润新知