• 【Python学习笔记】字符编码


    1. 字符串编码

    Python3语言里面的字符串对象是unicode字符串,在内存中实际存储时,使用的是 UTF16 编码。但通常不会将UTF16编码的内容写到磁盘或者在网络进行传输, 因为utf16编码比较浪费空间。特别是如果文字信息基本都是英文符号的情况下, utf16 都会用2个字节来代表英文符号。 一个字节其实就够了。

    所以,Python语言要对字符串对象 进行存储和传输的时候,通常要使用字符串的encode方法,参数指定编码方式,编码为一个 bytes 对象。

    bytes对象的底层就是用一个个的字节来存储字符串中的文字的。

    同样的字符串,用不同的编码方式,有时会产生不同的bytes结果。

    比如

    print ('你好'.encode('utf8')) # 输出 b'\xe4\xbd\xa0\xe5\xa5\xbd'
    print ('你好'.encode('gbk'))  # 输出 b'\xc4\xe3\xba\xc3'
    
    • 1
    • 2

    输出内容 中 b 开头,表示这是一个 字节串bytes 对象

    \x 说明是用16进制表示一个字节

    你好 两个字,使用 utf8 编码 后的字节串,用16进制来表示就是6个字节 e4bda0 e5a5bd

    e4bda0 对应 你
    e5a5bd 对应 好
    
    • 1
    • 2

    你好 两个字,使用 gbk 编码 后的字节串,用16进制来表示 却是4个字节 c4e3 bac3

    c4e3 对应 你
    bac3 对应 好
    
    • 1
    • 2

    encode方法返回的是编码后的字节串对象bytes 编码为字节串对象 bytes 就可存储到文件或者传输到网络中去了。

    2. 字节串解码

    当我们的Python程序从文件中读入文字信息, 从网络上接收文字信息,获取的数据通常是使用某种字符编码后的 字节串。程序通常需要解码,这样才方便程序理解和处理字符信息。

    Python语言的解码都是解码成 unicode字符串对象。

    要解码字节串,必须要知道这个字节串是用什么字符编码的方式进行编码的。

    如果知道了,就可以用字节串对象的decode方法进行解码,参数指定了编码方式

    比如

    print(b'\xe4\xbd\xa0\xe5\xa5\xbd'.decode('utf8'))
    print(b'\xc4\xe3\xba\xc3'.decode('gbk'))
    
    • 1
    • 2

    上面的两行代码都可以解码出 字符串 ‘你好’

    3. 一些字符编解码技巧

    unicode数字转换为字符

    把 unicode数字转换为字符, 使用函数 chr() , 比如:

    >>> chr(50)
    '2'
    >>> chr(20013)
    '中'
    >>> chr(0x4e2d)  # 0x开头表示数字是16进制
    '中'
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    字符转换为unicode数字

    反过来,要把 字符转换为对应的unicode数字,使用函数 ord()

    该函数参数字符串里面只能有一个字符

    >>> ord('2')
    50
    >>> ord('中')
    20013
    
    • 1
    • 2
    • 3
    • 4

    字符串编码为 unicode转义数字

    除了utf8,gbk 还有一种常见的编码方式,叫做 unicode-escape ,就是直接用unicode数字字符串表示字符,如下所示

    print('一二三四'.encode('unicode-escape'))
    $ python main.py
    b'\\u4e00\\u4e8c\\u4e09\\u56db'
    
    • 1
    • 2
    • 3

    用unicode转义数字写字符串

    print('\u4e00\u4e8c\u4e09\u56db')
    $ python main.py
    一二三四
    
    • 1
    • 2
    • 3

    字节串 和 16进制表示字节的字符串

    >>> a = b'hello,123'
    >>> a.hex()
    '68656c6c6f2c313233'
    
    • 1
    • 2
    • 3

    反向操作,把 16进制表示字节的字符串 转化为 字节串就是

    >>> bytes.fromhex('68656c6c6f2c313233')
    b'hello,123'
    
    • 1
    • 2
  • 相关阅读:
    Ubuntu Flask 运行 gunicorn+Nginx 部署
    timer trigger function
    css设置浏览器表单自动填充时的背景
    麒麟信安操作系统衍生产品解决方案 | 安全探针软件,竖起内网安全护城墙
    细胞膜修饰两亲性接枝聚合物/荧光探针/荧光染料/水凝胶/仿生纳米颗粒(ICNPs)的研究与制备
    一文读懂先验概率和后验概率
    【带RL负载的全波桥式整流器】功能齐全的单相非控整流器(Simulink)
    免费录音转文字的软件有哪些?不知道的小伙伴快来码住
    TXT文件恢复,简单3招,快速恢复文件!
    使用Apache HttpClient爬取网页内容的详细步骤解析与案例示例
  • 原文地址:https://blog.csdn.net/qq997758497/article/details/134018854