zoukankan      html  css  js  c++  java
  • python 字符编码问题

    字符编码

    一、字符编码的演进

    • ASCII
    • GB2312    GBK1.0    GB18030
    • Unicode编码:国际标准字符集,它将世界各种语言的每个字符定义一个唯一的编码,以满足跨语言、跨平台的文本信息转换。Unicode(统一码、万国码)规定所有的字符和符号最少由16位来表示(2个字节),即:2 ** 16 = 65535
    • UTF-8


    二、为什么有bytes?
    是因为要表示图片、视频等二进制格式的数据

    三、如何在python2实现,写一个软件,在全球各国电脑上,都能正常显示?
    答:1、以Unicode编码写你的软件,直接在内存里声明变量的时候以Unicode格式
    s = u'路飞' #Unicode
    2、转成Unicode,文件编码定义的utf-8,读取到内存里还是utf-8编码,所以需要解码转成Unicode
    d2 = d.decode("uft-8")
    d2 = d.decode("gbk")

    四、python2 和python3的区别
    py2:str = bytes,Unicode str类型,Unicode类型
    py3:str = Unicode,bytes str类型

    文件头声明
    py2:以uft-8 or GBK 等编码的代码,代码内容加载到内存,并不会被转成Unicode,编码依然是源编码
    py3:以utf-8 or GBK 等编码的代码,代码内容加载到内存,会被自动转成Unicode

    python2
    以utf-8编码的字符串,在Windows上的默认编码是GBK,读取到内存,python2上不会自动转成Unicode编码,所以不能正常显示


    python3
    字符串的编码改成了Unicode
    str就是Unicode格式的字符串
    bytes就是单纯的二进制
    文件的默认编码变成了utf-8

    在计算机内存中,统一使用Unicode编码,当需要保存到硬盘或者需要传输的时候,就转换为UTF-8编码
    用记事本编辑的时候,从文件读取的UTF-8字符被转换为Unicode字符到内存里,编辑完成后,保存的时候再把Unicode转换为UTF-8保存到文件


    对于单个字符的编码,Python提供了ord()函数获取字符的整数表示,chr()函数把编码转换为对应的字符

     

    python字符编码演示

    一、python2 Windows终端,GBK格式

    1、直接在Windows终端输入,定义的变量字符串编码格式应该是GBK

    PS C:Usersmartin> python2
    Python 2.7.14 (v2.7.14:84471935ed, Sep 16 2017, 20:25:58) [MSC v.1500 64 bit (AMD64)] on win32
    Type "help", "copyright", "credits" or "license" for more information.
    >>> d = "路飞"         #定义一个变量,因为是在Windows终端定义的,默认编码是GBK,所以该字符串的编码格式为GBK
    >>> d
    'xc2xb7xb7xc9'    #这里可以看出来该变量是GBK格式的,GBK编码,一个中文占用两个字节,一个字节用两个十六进制表示,python2里的字符串和字节是等同的
    >>> print d
    路飞                   #这里没有乱码,是因为该字符串是GBK编码的的,终端的编码格式也是GBK,所以能正常显示
    >>> d2 = d.decode()   #python2 内存里默认的解码的编码是ASCII,这里没指定,常用的ASCII最高位为0,而这个字符串是中文,GBK编码,最高位为1,所以ASCII提示无法解码
    Traceback (most recent call last):
    File "<stdin>", line 1, in <module>
    UnicodeDecodeError: 'ascii' codec can't decode byte 0xc2 in position 0: ordinal not in range(128)
    >>> d2 = d.decode("gbk")      #把字符串以GBK编码解码成Unicode
    >>> d2
    u'u8defu98de'               #Unicode类型,python2中str==byte,有单独的Unicode类型
    >>> print d2
    路飞                          #虽然这里是GBK编码的终端,但因为所有系统都支持Unicode,所以这里能正常显示
    >>> d3 = d2.encode("utf-8")  #将d2以utf-8编码,存储和网络传输一般选择utf-8编码
    >>> d3
    'xe8xb7xafxe9xa3x9e'   #uft-8编码一个中文占3个字节
    >>> print d3
    璺��                         #uft-8编码格式的d3读取到内存后,utf-8一个中文占三个字节,终端默认是GBK,GBK一个中文占两个字节,所以显示不正常


    2、以文件的方式保存,声明编码格式为utf-8,那里面定义的变量字符串是utf-8编码格式,在python2上运行,查看结果

    #!/usr/bin/env python
    # -*-coding:utf-8-*-
    d = "路飞" 
    print(type(d))
    print(d)
    
    输出:
    <type 'str'>       #python2定义的变量为字符串类型,字符串以声明的或默认的编码格式存储字符串
    璺��               #这里编码格式是utf-8,uft-8一个中文占三个字节,终端默认是GBK,GBK一个中文占两个字节,读取到内存后,GBK无法正确判断对应关系,所以显示不正常
    
    d2 = d.decode("utf-8") #这里讲utf-8编码格式解码成Unicode
    print(type(d2))
    print(d2)
    
    输出:
    <type 'unicode'>
    路飞                   #虽然这里是GBK编码的终端,但因为所有系统都支持Unicode,所以这里能正常显示
    
    d3 = d2.encode("gbk")  #将Unicode编码成GBK格式
    print(type(d3))
    print(d3)
    输出: <type 'str'> 路飞 #因为终端就是GBK编码的,所以能正常显示

    二、python3 Windows终端 GBK格式
    1、直接Windows终端输入

    PS C:Usersmartin> python
    Python 3.6.3 (v3.6.3:2c5fed8, Oct 3 2017, 17:26:49) [MSC v.1900 32 bit (Intel)] on win32
    Type "help", "copyright", "credits" or "license" for more information.
    >>>
    >>> s = "路飞"            #python3中的字符串是Unicode格式,定义的变量字符串在内存里默认都是Unicode,Unicode编码格式的字符串
    >>> type(s)
    <class 'str'>
    >>> s
    '路飞'
    
    >>> s2 = s.encode("gbk") #将Unicode以GBK格式编码
    >>> type(s2)
    <class 'bytes'>
    >>> s2
    b'xc2xb7xb7xc9'
    
    >>> s3 = s2.decode()        #将GBK格式的编码以默认的编码(uft-8)解码,因为是GBK格式的编码,所以用utf-8解码会报错
    Traceback (most recent call last):
    File "<stdin>", line 1, in <module>
    UnicodeDecodeError: 'utf-8' codec can't decode byte 0xb7 in position 2: invalid start byte
    >>> s3 = s2.decode("gbk")   #将GBK格式的编码以GBK解码
    >>> type(s3)
    <class 'str'>
    >>> s3
    '路飞'
    
    >>> s4 = s3.encode()        #以utf-8编码
    >>> type(s4)
    <class 'bytes'>
    >>> s4
    b'xe8xb7xafxe9xa3x9e' #一个中文占三个字节
    
    >>> s5 = s4.decode()        #以uf-8解码
    >>> type(s5)
    <class 'str'>
    >>> s5
    '路飞'


    2、以文件的方式保存,声明编码格式为utf-8

     

    s = "路飞"               #python3中的字符串是Unicode
    print(s)
    print(type(s))
    
    输出:
    路飞
    <class 'str'>
    
    
    s2 = s.encode("gbk")    # 一个字节占8bit,8bit = 1byte,x代表十六进制,两个十六进制占一个byte,把s以GBK格式编码成字节类型
    print(s2)
    print(type(s2))
    
    输出:
    b'xc2xb7xb7xc9'
    <class 'bytes'>
    
    
    
    s3 = s2.decode("gbk")  #把字节类型的s3以GBK格式解码成Unicode格式的字符串
    print(s3)
    print(type(s4))
    
    输出:
    路飞
    <class 'str'>
  • 相关阅读:
    IHttpHandler做文件防盗链接
    使用SQL的全文搜索功能构建 Web 搜索应用程序
    Google 二维条码 API
    Flash Media Server 入门教程
    Janus WinForms Controls Suite v2.0.1000
    如何将数据大容量加载到合并发布中的表(复制 TransactSQL 编程)
    转:CentOS 5.4下的Memcache安装
    转:用php读取xml数据
    HPUX启动和关闭
    目录,文件操作详谈—php
  • 原文地址:https://www.cnblogs.com/jmaly/p/7999343.html
Copyright © 2011-2022 走看看