zoukankan      html  css  js  c++  java
  • 字符编码,pyton中的encode,decode,unicode()

    1.在计算机处理的程序中,对字符的处理有两种方式:编码或译码(encoding),解码(decoding)
        encoding:将字符串中的字符转换到对应编码字符集对应的代码点
                 每一个代码点对于了一些数字,计算机真正存的是这些数字
            如:
                "python",转换到unicode码的对应为:

       P           y           t           h           o           n
    0x50 00 00 00 79 00 00 00 74 00 00 00 68 00 00 00 6f 00 00 00 6e 00 00 00
       0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23


        decoding:将别的编码解析为当前环境的编码,如当前环境是unicode,则

                 string.decode('utf8'),将将字符串从utf8转换为unicode


    2.几种编码:
        ASCLL, unicode, Latin-1又名ISO-8859-1
        ASCLL:表示的范围为:0--127的字符
        unicode: 表示的范围为0--(2^16-1)个字符
        Latin-1或ISO-8859-1:0--(2^16-1)个字符
        UTF-8:(Unicode Transformation Format),8表示使用8位数字编码,             
        表示的范围很广,有一个字节,两个字节,三个字节存储的
        其中:unicode和Latin-1编码的前127个字符编码跟ASCLL一样,后面的unicode和
             Latin-1不一样,所以当unicode和latin-1转码为ASCLL时,若都是英文,
             是不会出错的,当是中文时,会出错,而当unicode转换为Latin-1时,只转换
             大于127的字符编码的字符就可以了
        ISO-8859-1编码是单字节编码,向下兼容ASCII,其编码范围是0x00-0xFF,
        0x00-0x7F之间完全和ASCII一致,0x80-0x9F之间是控制字符,0xA0-0xFF
        之间是文字符号。
        UTF-8:编码的规则:
            1,如果代码点小于128,用一个字节存,这个和ASCLL兼容的
            2,如果代码点的范围为128 -- 255,用两个字节存储
            3,大于255的有的以三个字节存储,有的以四个字节存储    
        UTF-8的一些方便的特性:
            1,可以操作unicode的代码点
            2,一个unicode字符集编码的字符串,存在的编码中不含有0字节,这避免了字节的
            排序问题,意味着,utf-8字符串可以使用C风格的函数如strcpy()来处理字符串,
            (C语言中遇到0为字符串截至了)
            3,一个ASCLL字符串也是有效的UTF-8字符串
            4,utf-8使用紧凑压缩,大多数的代码点都转换为两个字节,小于128的转换

            为一个字节    


    3.python 默认编码是ASCLL,所以要展示中文时,应该加一句其他编码声明,如utf-8,
        在文件的第一或第二句添加:# -*- coding:utf-8 -*-

        当文件中出错时,会报错不支持的ASCLL码,英文中文编码后,大于127,所以报错


    4,python中unicode的应用:
        1,unicode是python中内置的存储类型,这个来源于抽象数据类型basestring,这
        也是str的祖先,如果想判断一个字符串类型的值可以这样:
        if isinstance(value, basestring),python呈现unicode字符串在16位和32位
        之间,这个依赖于相应的解析器
        2,unicode()构造函数:
            unicode(string, encoding,  errors),string是将要被转换为unicode码
            的字符串,encoding指定原字符串的字符集,errors有三个值:strict出现
            转码错误时,报异常UnicodeDecodeError,replace将其以FFFD存储,ignore
            不管这个错误,丢失掉这个字符
            不写encoding时,默认为ASCLL码,如:

    		例子1:
            >>> unicode('python')
            u'python'
    		例子2:
            >>> unicode('python' + chr(255))
            Traceback (most recent call last):
            ...
            UnicodeDecodeError: 'ascii' codec can't decode byte 0xff in
            position 6: ordinal not in range(128)
    		例子3:
    		>>> unicode('x80abc', errors='strict')     
    		Traceback (most recent call last):
    		...
    		UnicodeDecodeError: 'ascii' codec can't decode byte 0x80 in position 0:
    		ordinal not in range(128)
    		例子4:
    		>>> unicode('x80abc', errors='replace')
    		u'ufffdabc'
    		例子5:
    		>>> unicode('x80abc', errors='ignore')
    		u'abc'
    

        3,使用unichr()函数可以自定代码点的值,得到对于的unicode表示
          ord()函数可以将unicode编码格式得到其对应的十进制数字
        如:

            >>> unichr(409600)
            u'ua000'   -> a000 = b1010000 00000000 = 40960
            >>> ord(u'ua000')
            40960

        4,因为unicode兼容8位的ASCLL编码,所以,对于英文字符串,或代码的值小于
          128的都可以用一些8位字符串类型的操作,如搜索,格式化等:
          string.count('e') -->计算字符串string中的e出现的次数
          string.find('feather') -->查找在string中出现字串feather的第一个位置
            找到返回第一个位置,为找到返回-1
          string.replace('from','to'),将string中的所有from替换为to
         但如果是大于127的使用这些函数,就会报错,如

          >>> s = 'python'
          >>> s.find('wasx9f')
            Traceback (most recent call last):
            ...
            UnicodeDecodeError: 'ascii' codec can't decode byte 0xff in
            position 3: ordinal not in range(128)

       5,string.encode(encoding, error)函数:
            改函数为将string编码为指定的编码,error的参数跟unicode()函数类似
            但前提是,原来的编码已经是8位数字的编码了,所以,在使用前,应该是:
                1,string.decode('utf8').encode('utf8'),decode('utf8'),
                  将字符串string从utf8解析为unicode码,然后转换为utf8
                2,string.decode('gbk').encode('utf8'),将原来的字符串从gbk编码
                  转换为unicode码,然后转换为utf8

            如:

                #原始字符串,包含了代码点为40960的字符,也有小于128的字符串abcd
    			>>> u = unichr(40960) + u'abcd' + unichr(1972)
                #转换为对应的utf-8编码
    			>>> u.encode('utf-8')
    			'xeax80x80abcdxdexb4'
                #转换为对于的ASCLL码,由于有大于127的代码点,报错
    			>>> u.encode('ascii')                       
    			Traceback (most recent call last):
    				...
    			UnicodeEncodeError: 'ascii' codec can't encode character
                u'ua000' in position 0: ordinal not in range(128)
                #当参数为ignore时,大于127的代码点的数据丢失
    			>>> u.encode('ascii', 'ignore')
    			'abcd'
                #有两种替换方式,都可以使用
    			>>> u.encode('ascii', 'replace')
    			'?abcd?'
    			>>> u.encode('ascii', 'xmlcharrefreplace')
    			'ꀀabcd޴'



  • 相关阅读:
    vim复制
    嵌入式Linux学习(二)
    (Java实现) 洛谷 P1042 乒乓球
    (Java实现) 洛谷 P1042 乒乓球
    (Java实现) 洛谷 P1071 潜伏者
    (Java实现) 洛谷 P1071 潜伏者
    (Java实现) 洛谷 P1025 数的划分
    (Java实现)洛谷 P1093 奖学金
    (Java实现)洛谷 P1093 奖学金
    Java实现 洛谷 P1064 金明的预算方案
  • 原文地址:https://www.cnblogs.com/keanuyaoo/p/3397787.html
Copyright © 2011-2022 走看看