zoukankan      html  css  js  c++  java
  • python3.x 基础三:字符集问题

     总结了一张表,更详细信息百度百科:

    序号 年份 编码 标准协会 特点 二进制长度 字符长度 表现
    1 1967 ASCII 美国国家标准学会
    (American National Standard Institute , ANSI )
    只能表示英文/数字/控制符符/现世符
    不能表示中文
    7位或8位二进制数组 1个字节 0~31,127(共33位)表示控制字符或者通信专用字符
    32~126(共95为)表示字符,32是空格
        48~57表示0~9个阿拉伯数字
    65~90表示26个大写英文字母
    97~122表示26个小写英文字母
    其他表示标点符号和运算符号等
    128~255是扩展ASCII,每个字符的第8位用于确定附加的128个特俗符号字符/图形/外来字母
    2 1981 GB2312 中国国家标准总局 可以表示中文,图形字符
    古汉字不能支持
    2组8进制位 2个字节 3755个一级汉字
    3008个二级汉字
    682个拉丁/希腊字母/日文片假名/片假名字母/俄语西里尔字母
    3 1995 GBK 中华人民共和国
    全国信息技术标准化技术委员会
    兼容GB2312
    windowns中文版系统的编码
    2组8进制位 2个字节 GB 2312 中的全部汉字、非汉字符号。
    BIG5 中的全部汉字。
    与 ISO 10646 相应的国家标准 GB 13000 中的其它 CJK 汉字,以上合计 20902 个汉字。
    其它汉字、部首、符号,共计 984 个。
    4 2001 GB18030 信息产业部和国家质量技术监督局 1字节与ASCII兼容
    2字节与DBK兼容
      1/2/4个字节 70244多个,各种少数民族字符
    5 1994 Unicode 非营利机构统一码联盟 跨语言跨平台
    英文浪费一半以上空间存储
    至少2个字节 英文1个字节
    中文2个字节
    16位来统一表示所有的字符
    原来8位全部扩充到16位
    6 6 UTF-8 Ken Thompson
    RFC 3629
    Unicode实现方式
    伴随互联网出现
    每次传输8位数据
    使编码无国界
    万国码
    可变长 ASCII1个字节
    欧洲字符2个字节
    中文3个字节
    编码体积大

    python2.7

    • 默认编码集是ASCII,如果直接encode(编码集),默认进行一次ascii解码
    >>> import sys
    >>> print("系统默认编码是:",sys.getdefaultencoding())
    ('xe7xb3xbbxe7xbbx9fxe9xbbx98xe8xaexa4xe7xbcx96xe7xa0x81xe6x98xafxefxbcx9a', 'ascii')
    >>> s = "你好"
    >>> s_to_gbk = s.encode("gbk")
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    UnicodeDecodeError: 'ascii' codec can't decode byte 0xe4 in position 0: ordinal not in range(128)
    >>> s_to_gbk = s.decode().encode("gbk")
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    UnicodeDecodeError: 'ascii' codec can't decode byte 0xe4 in position 0: ordinal not in range(128)
    • 需要进行一次明确解码
    >>> s = "你好"
    >>> s_to_unicode = s.decode("utf-8")
    >>> print(s_to_unicode)
    你好
    >>> s_to_gbk = s_to_unicode.encode("gbk")
    >>> print(s_to_gbk)    #终端切换成GBK可以正常显示
    ▒▒▒
    >>> gbk_to_utf8 = s_to_gbk.decode("gbk").encode("utf-8")
    >>> print(gbk_to_utf8)
    你好
    >>>
    #python2.7 字符串 -> unicode -> decode(原编码) -> encode(目标编码

    GB2312 -> UTF8 -> GBK -> UTF8 -> GB2312

    >>> import sys
    >>> print("系统默认编码是:",sys.getdefaultencoding())
    ('xe7xb3xbbxe7xbbx9fxe9xbbx98xe8xaexa4xe7xbcx96xe7xa0x81xe6x98xafxefxbcx9a', 'ascii')
    >>>
    >>> s = "你好"
    >>> s_to_gb2312 = s.decode("utf-8").encode("gb2312")
    >>> print(s_to_gb2312)  #终端编码为gb2312可以正常显示
    ▒▒▒
    >>> s_to_gb2312_to_utf8 = s_to_gb2312.decode("gb2312").encode("utf-8")
    >>> print(s_to_gb2312_to_utf8)
    你好
    >>> s_to_gb2312_to_utf8_to_gbk = s_to_gb2312_to_utf8.decode("utf-8").encode("gbk")
    >>> print(s_to_gb2312_to_utf8_to_gbk) ##终端编码为gbk可以正常显示
    ▒▒▒
    >>> s_to_gb2312_to_utf8_to_gbk_to_utf8 = s_to_gb2312_to_utf8_to_gbk.decode("gbk").encode("utf-8")
    >>> print(s_to_gb2312_to_utf8_to_gbk_to_utf8)
    你好
    >>> s_to_gb2312_to_utf8_to_gbk_to_utf8_to_gb2312 = s_to_gb2312_to_utf8_to_gbk_to_utf8.decode("utf-8").encode("gb2312")
    >>> print s_to_gb2312_to_utf8_to_gbk_to_utf8_to_gb2312
    ▒▒▒

    python3.5

    • 默认编码是unicode
    • 文件头部coding:gbk定义文件编码格式
    • 但是程序本身依然是unicode编码格式,与文件格式无关
    
    
    # /usr/bin/env python
    # -*- coding: gbk -*-
    # Author:jenvid.yang
    import sys
    print("系统默认编码是:", sys.getdefaultencoding())
    msg = '世界你好'
    # unicode程序编码,文件头部定义的是文件编码
    msg_unicode_to_gbk = msg.encode("gbk")
    # 已经是unicode,只能encode成其他编码
    print("unicode -> gbk: ",msg_unicode_to_gbk)

    msg_unicode_to_utf8 = msg.encode("utf-8")
    print("unicode -> utf8: ",msg_unicode_to_utf8)

    msg_unicode_to_gb2312 = msg.encode("gb2312")
    print("unicode -> gb2312: ",msg_unicode_to_gb2312)

    msg_unicode_to_utf8_to_gbk = msg_unicode_to_utf8.decode("utf-8").encode("gbk")
    # 默认decodeutf-8,可以不写,显示指定
    print("unicode -> utf8 -> gbk: ",msg_unicode_to_utf8_to_gbk)

    msg_unicode_to_utf8_to_gbk =msg_unicode_to_utf8.decode("utf-8").encode("gb2312")
    # 默认decodeutf-8,可以不写,但显示指定
    print("unicode -> utf8 -> gb2312: ",msg_unicode_to_utf8_to_gbk)
    # gbk兼容gb2312
    print(msg_unicode_to_utf8.decode("utf-8").encode("gb2312").decode("gb2312"))
    print(msg.encode("utf-8").decode("utf-8"))
    # decode的时候将字节码转换成字符串
    # str方法指定原编码也可以转换成字符串
    print(str(msg_unicode_to_utf8,encoding="utf-8"))
    print(str(msg_unicode_to_gb2312,encoding=
    "gb2312"))

    输出如下:
    
    
    # 系统默认编码是: utf-8
    # unicode -> gbk: b'xcaxc0xbdxe7xc4xe3xbaxc3'
    # unicode -> utf8: b'xe4xb8x96xe7x95x8cxe4xbdxa0xe5xa5xbd'
    # unicode -> gb2312: b'xcaxc0xbdxe7xc4xe3xbaxc3'
    # unicode -> utf8 -> gbk: b'xcaxc0xbdxe7xc4xe3xbaxc3'
    # unicode -> utf8 -> gb2312: b'xcaxc0xbdxe7xc4xe3xbaxc3'
    # 世界你好
    # 世界你好
    # 世界你好
    # 世界你好
     
  • 相关阅读:
    Kubernetes 架构(上)【转】
    部署 k8s Cluster(下)【转】
    部署 k8s Cluster(上)[转]
    k8s 重要概念[转]
    k8s 核心功能[转]
    5 秒创建 k8s 集群[转]
    内置函数——format
    基础数据类型(set集合)
    Oracle 传参错误
    .NET参数化Oracle查询参数
  • 原文地址:https://www.cnblogs.com/jenvid/p/7826144.html
Copyright © 2011-2022 走看看