首页 > 代码库 > 极客学院python学习笔记

极客学院python学习笔记

基础

  字符编码

    • 字符:  字符是一个信息单位, 它是各种文字和符号的总称, 包括各国家文字, 标点符号, 图形符号,数字等
    • 字符集: 字符集是字符的集合. 字符集的种类很多, 每个字符集包含的字符个数也不同. 常见的字符集有ASCII字符集, GB2312字符集, Unicode字符集等
    • 字符编码:  是指对于字符集中的字符, 将其编码为特定的二进制数, 以便计算机处理. 常见的字符编码有ASCII编码, UTF-8编码, GBK编码
      • ASCII:  在 20 世纪 60 年代,美国制定了一套字符编码方案,规定了英文字母,数字和一些普通符号跟二进制的转换关系,被称为 ASCII码.
      • Unicode: 

        ASCII 码只规定了 128 个字符的编码,这在美国是够用的。可是,计算机后来传到了欧洲,亚洲,乃至世界各地,而世界各国的语言几乎是完全不一样的,用 ASCII 码来表示其他语言是远远不够的,所以,不同的国家和地区又制定了自己的编码方案,比如中国大陆的 GB2312 编码 和 GBK 编码等,日本的 Shift_JIS 编码等等。

        虽然各个国家和地区可以制定自己的编码方案,但不同国家和地区的计算机在数据传输的过程中就会出现各种各样的乱码(mojibake),这无疑是个灾难。

        怎么办?想法也很简单,就是将全世界所有的语言统一成一套编码方案,这套编码方案就叫 Unicode,它为每种语言的每个字符设定了独一无二的二进制编码,这样就可以跨语言,跨平台进行文本处理了

      • UTF-8:

        Unicode 看起来已经很完美了,实现了大一统。但是,Unicode 却存在一个很大的问题:资源浪费。

        为什么这么说呢?原来,Unicode 为了能表示世界各国所有文字,一开始用两个字节,后来发现两个字节不够用,又用了四个字节。这时,问题就来了,如果以前的 ASCII 字符集也用这种方式来表示,那岂不是很浪费存储空间。为了解决这个问题,在 Unicode 的基础上,人们实现了 UTF-16, UTF-32 和 UTF-8。

        UTF-8 (8-bit Unicode Transformation Format) 是一种针对 Unicode 的可变长度字符编码,它使用一到四个字节来表示字符,例如,ASCII 字符继续使用一个字节编码,阿拉伯文、希腊文等使用两个字节编码,常用汉字使用三个字节编码,等等。

        因此,我们说,UTF-8 是 Unicode 的实现方式之一,其他实现方式还包括 UTF-16(字符用两个或四个字节表示)和 UTF-32(字符用四个字节表示)。

    • python的默认编码: python2的默认编码是ascii, python3的默认编码是utf-8

       import sys

       sys.getdefaultencoding()

    • python2中有两种和字符相关的类型: str和unicode, 它们的父类是basestring. 其中,str 类型的字符串有多种编码方式,默认是 ascii,还有 gbk,utf-8 等,unicode 类型的字符串使用 u‘...‘ 的形式来表示
    • 把 UTF-8 编码表示的字符串 ‘xxx‘ 转换为 Unicode 字符串 u‘xxx‘ 用 decode(‘utf-8‘) 方法
    • 把 u‘xxx‘ 转换为 UTF-8 编码的 ‘xxx‘ 用 encode(‘utf-8‘) 方法
    • 在进行同时包含 str 类型和 unicode 类型的字符串操作时,Python2 一律都把 str 解码(decode)成 unicode 再运算,这时就很容易出现 UnicodeDecodeError
    • 如果函数或类等对象接收的是 str 类型的字符串,但你传的是 unicode,Python2 会默认使用 ascii 将其编码成 str 类型再运算,这时就很容易出现 UnicodeEncodeError。

极客学院python学习笔记