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('was\x9f')
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')
'\xea\x80\x80abcd\xde\xb4'
#转换为对于的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޴'

字符编码,pyton中的encode,decode,unicode()的更多相关文章

  1. 字符编码和python使用encode,decode转换utf-8, gbk, gb2312

    ASCII码 标准ASCII码使用7位二进制数表示大写或小写字母,数字0到9标点符号以及在美式英语中使用的特殊控制字符. 在标准ASCII码中,最高位(b7)用作奇偶校验位,所谓奇偶校验,是指在代码传 ...

  2. 字符编码终极笔记:ASCII、Unicode、UTF-8、UTF-16、UCS、BOM、Endian

    1.字符编码.内码,顺带介绍汉字编码 字符必须编码后才能被计算机处理.计算机使用的缺省编码方式就是计算机的内码.早期的计算机使用7位的ASCII编码,为了处理汉字,程序员设计了用于简体中文的GB231 ...

  3. 第48篇 字符编码探密--ASCII,UTF8,GBK,Unicode

    原文地址:http://blog.laofu.online/2017/08/22/encode-string/ ASCII 的由来 在计算机的“原始社会”,有人想把日常的使用的语言使用计算机来表示, ...

  4. 常见三种字符编码的区别:ASCII、Unicode、UTF-8

    什么是字符编码? 计算机只能处理数字,如果要处理文本,就必须先把文本转换为数字才能处理.最早的计算机在设计时采用8个比特(bit)作为一个字节(byte),所以,一个字节能表示的最大的整数就是255( ...

  5. 字符编码的来源,ascii、unicode和utf-8编码的关系

    字符编码 我们已经讲过了,字符串也是一种数据类型,但是,字符串比较特殊的是还有一个编码问题. 因为计算机只能处理数字,如果要处理文本,就必须先把文本转换为数字才能处理.最早的计算机在设计时采用8个比特 ...

  6. 字符编码的发展(ASCII、Unicode、utf-8)

    最近一直在看廖雪峰老师的python网上教程,python内容简单易理解,就没整理,但是字符串编码作为一直困扰自己的问题,看了几遍文章,最终还是将其整理如下,本篇博客总结自廖雪峰老师的网上教程:htt ...

  7. 字符编码ANSI和ASCII区别、Unicode和UTF-8区别

    ANSI码ANSI编码是一种对ASCII码的拓展:ANSI编码用0x00~0x7f (即十进制下的0到127)范围的1 个字节来表示 1 个英文字符,超出一个字节的 0x80~0xFFFF 范围来表示 ...

  8. python encode decode unicode区别及用法

    decode 解码 encode 转码 unicode是一种编码,具体可以百度搜 # coding: UTF-8 u = u'汉' print repr(u) # u'\u6c49' s = u.en ...

  9. php字符编码转换中的iconv与mb_convert_encoding用法

    iconv ( 'UTF-8' , 'GBK' , $str ); //将$str字符串 utf-8 编码转换成 gbk: 另外,5.4.0 这个版本起,字符非法时候会返回 FALSE,除非在输出字符 ...

随机推荐

  1. 从徐飞的文章《Web应用的组件化开发(一)中窥视web应用开发的历史

    Web应用的组件化开发(一) 原文来自 徐飞 基本思路 1. 为什么要做组件化? 无论前端也好,后端也好,都是整个软件体系的一部分.软件产品也是产品,它的研发过程也必然是有其目的.绝大多数软件产品是追 ...

  2. PHP PDO类

    <?php //数据库连接类,不建议直接使用DB,而是对DB封装一层 //这个类不会被污染,不会被直接调用 class DB { //pdo对象 private $_pdo = null; // ...

  3. SGU 289. Challenging Tic-Tac-Toe

    注意一个问题就是不合法状态的判定.一个是点数不对,一个是X赢了,但是0接着下了一个子,一个是0赢了,但X也接着下了子,判断一下就行了. 做法是直接搜索,然后调参数...比较难懂的说. #include ...

  4. TCP连接复用

    转自网络:看到一陌生名词,记录一下 TCP连接复用技术通过将前端多个客户的HTTP请求复用到后端与服务器建立的一个TCP连接上.这种技术能够大大减小服务器的性能负载,减少与服务器之间新建TCP连接所带 ...

  5. 设置iframe 载入页面的效果跟直接打开这个页面一样

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xht ...

  6. npm 安装或更新模块失败的解决办法

    头一次关注npm,在刚刚安装的机子上使用更新指令却报错,我还以为是SHA512有什么问题,后来发现是因为一些网络原因,所以,如果出现错误,务必修改默认配置为国内镜像,但是在publish之前,记得要改 ...

  7. js for循环的陷阱

    ☞问题概述 一页面有三个按钮,点击提示相应内容.相应内容已从后台获取,并转化成json数组. var content = ["提示1", "提示2", &quo ...

  8. 删除元素(LintCode)

    删除元素 给定一个数组和一个值,在原地删除与值相同的数字,返回新数组的长度. 元素的顺序可以改变,并且对新的数组不会有影响. 样例 给出一个数组 [0,4,4,0,0,2,4,4],和值 4 返回 4 ...

  9. [BZOJ4003][JLOI2015]城池攻占(左偏树)

    这题有多种做法,一种是倍增预处理出每个点往上走2^i步最少需要的初始战斗力,一种是裸的启发式合并带标记splay. 每个点合并能攻占其儿子的所有骑士,删去所有无法攻占这个城市的骑士并记录答案. 注意到 ...

  10. BZOJ 2789 letters(树状数组)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2789 [题目大意] 给出两个字符串,通过A字符串相邻之间字符的交换得到B字符串, 求最 ...