了解编码之前首先说下这几个词的概率:

位、字节、字符、字符串

  1、位(bit)也称为比特

    这个其实很简单,因为计算机都是二进制存储数据,也就是0和1,一个0或者1就表示一位。这是计算机存储的最小单位。

  2、字节(bytes)

    一个字节由8位组成,00000000到11111111 如果第一位不做符号位,那么一个字节能表示的整数范围:0-255。我们平常的网络传出信息,都是转换为字节进行传输的。

  3、字符

    比如 'a'或者'b'这就表示一个字符a 一个字符b。

  4、字符串

    至少两个字符就组成了字符串,比如:'123456aa'。

有了上面这些了解,就可以正式说说编码的问题:

  ASCII编码:(一个字节)

    由于计算机是美国人发明的,他们最初只考虑了他们自己语言,所以他们就只把字母、数字、特殊符号总共127字符编码进了计算机,形成了ASCII编码表。

    由于字符比较少,只用了一个字节,就能存储所有的字符:二进制从0000 0000 到 0111 1111    十进制 0-127

    ASCII值:数字的ASCII码<大写字母的ASCII码<小写字母的ASCII码。

    查询ASCII技巧,方便查询ASCII码对应的字符:新建一个文本文档,按住ALT+要查询的码值(注意,这里是十进制),松开即可显示出对应字符。例如:按住ALT+97,则会显示出'a'。

  GB2312编码:(两个字节)

    我们也把所有的汉字编码进了计算机,由于汉字很多而且不能与ASCII编码冲突,所以一个汉字至少需要两个字节来编码。

    但这里就出现问题了,那么多个国家,那么多语言,没有标准,各自编码进去,肯定会很混乱。

  Unicode编码:(至少两个字节)

    Unicode编码就是为了 解决语言混乱问题而出现的,Unicode把所有语言都统一到一套编码里,这样就不会再有乱码问题了。由于语言众多,至少都要两个字节,并且为了兼容以前的老程序,ASCII里面字符对应的编码不用变,只需要前面加8个0凑成两个字节就够了。

  虽然这样统一了,可以解决乱码问题,不过却存在存储资源的浪费。如果一篇文章全是英文写的,以前只要1K,现在就得2k,存储空间浪费太多。

  UTF-8编码:(1-6个字节)可变长编码

   utf-8就在unicode上进行了升级。常用的英文字母被编码成1个字节,汉字通常是3个字节,只有很生僻的字符才会被编码成4-6个字节,这样如果是全英文的就大大节省空间。

  在计算机内存中,统一使用Unicode编码,当需要保存到硬盘或者需要传输的时候,就转换为UTF-8编码。

  用记事本编辑的时候,从文件读取的UTF-8字符被转换为Unicode字符到内存里,编辑完成后,保存的时候再把Unicode转换为UTF-8保存到文件:

字符 ASCII Unicode UTF-8
A 01000001 00000000 01000001 01000001
x 01001110 00101101 11100100 10111000 10101101

  对于单个字符的编码,Python提供了ord()函数获取字符的整数表示,chr()函数把编码转换为对应的字符:这里的整数都是对应该字符再Unicode中的编码

  ord('A')   #65

  ord(‘中’)#20013

  chr(20013)  #'中'

  

  由于Python的字符串类型是str,在内存中以Unicode表示,一个字符对应若干个字节。如果要在网络上传输,或者保存到磁盘上,就需要把str变为以字节为单位的bytes

  Python对bytes类型的数据用带b前缀的单引号或双引号表示:

  x = b'ABC'

  注意区分'ABC'b'ABC',前者是str,后者虽然内容显示得和前者一样,但bytes的每个字符都只占用一个字节。

  以Unicode表示的str通过encode()方法可以编码为指定的bytes,在bytes中,无法显示为ASCII字符的字节,用\x##显示,例

>>> 'ABC'.encode('ascii')
b'ABC'
>>> '中文'.encode('utf-8')
b'\xe4\xb8\xad\xe6\x96\x87'

  如果我们从网络或磁盘上读取了字节流,那么读到的数据就是bytes。要把bytes变为str,就需要用decode()方法: 

>>> b'ABC'.decode('ascii')
'ABC'
>>> b'\xe4\xb8\xad\xe6\x96\x87'.decode('utf-8')
'中文'

python中的字符串和编码的更多相关文章

  1. 【转】Python中的字符串与字符编码

    [转]Python中的字符串与字符编码 本节内容: 前言 相关概念 Python中的默认编码 Python2与Python3中对字符串的支持 字符编码转换 一.前言 Python中的字符编码是个老生常 ...

  2. Python中Unicode字符串

    Python中Unicode字符串 字符串还有一个编码问题. 因为计算机只能处理数字,如果要处理文本,就必须先把文本转换为数字才能处理.最早的计算机在设计时采用8个比特(bit)作为一个字节(byte ...

  3. Python中的字符串处理

    Python转义字符 在需要在字符中使用特殊字符时,python用反斜杠(\)转义字符.如下表: 转义字符 描述 \(在行尾时) 续行符 \\ 反斜杠符号 \' 单引号 \" 双引号 \a ...

  4. 一句python,一句R︱python中的字符串操作、中文乱码、NaN情况

    一句python,一句R︱python中的字符串操作.中文乱码.NaN情况 先学了R,最近刚刚上手Python,所以想着将python和R结合起来互相对比来更好理解python.最好就是一句pytho ...

  5. python中修改字符串的几种方法

    在Python中,字符串是不可变类型,即无法直接修改字符串的某一位字符.因此改变一个字符串的元素需要新建一个新的字符串.常见的修改方法有以下4种. 方法1:将字符串转换成列表后修改值,然后用join组 ...

  6. python中根据字符串导入模块module

    python中根据字符串导入模块module 需要导入importlib,使用其中的import_module方法 import importlib modname = 'datetime' date ...

  7. python中的字符串

    一.在python中,字符串是不可变类型 通过以下代码说明: >>> s = 'hello, world' >>> id(s) 2108634288304 > ...

  8. Python中常见字符串去除空格的方法总结

    Python中常见字符串去除空格的方法总结 1:strip()方法,去除字符串开头或者结尾的空格>>> a = " a b c ">>> a.s ...

  9. Python中的字符串方法

    Python中的字符串方法 字符串类即str提供了许多有用的方法来操纵字符串.具体来说,我们将讨论如下的方法. 搜索字符串内的子字符串. 测试字符串. 格式字符串. 转换字符串. 回顾前面的章节,方法 ...

随机推荐

  1. 旋转图像 · Rotate Image

    [抄题]: You are given an n x n 2D matrix representing an image. Rotate the image by 90 degrees (clockw ...

  2. yii 关于如何改变默认访问的控制器(site)

    以前Yii1学了个皮毛就没去管了,现在想重新捡起来Yii2.0.2却出来了,于是搭建好环境来学习. 安装好Yii2后第一个想到的问题就是修改默认的控制器了. 按照网上所说,终于在/vendor/yii ...

  3. yum 系列(二) 离线部署

    yum 系列(二) 离线部署 一.下载 rpm 依赖包 (1) yum 下载 rpm 包 准备一台 全新的 CentOS7 mini 虚拟机 ,联网下载所有所需的 rpm 包和其依赖, yum ins ...

  4. Jakarta Commons Cookbook

      Cookbook就是工具书,应该是前年看的,在中关村看的影印版,全英文,本书主要讲解了一下模块: Core:BeanUtils,Lang,Collections,logging Db:DbUtil ...

  5. QQ互联

    [移动应用接入概述] QQ互联开放平台为第三方移动应用提供了丰富的API.第三方移动应用接入QQ互联开放平台后,即可通过调用平台提供的API实现用户使用QQ账号登录移动应用功能,且可以获取到腾讯QQ用 ...

  6. hadoop 分布式集群安装

    这一套环境搭完,你有可能碰到无数个意想不到的情况. 用了1周的时间,解决各种linux菜鸟级的问题,终于搭建好了.. 沿途的风景,甚是历练. 环境介绍: 系统:win7 内存:16G(最低4G,不然跑 ...

  7. 关于SQLServer无法对数据库'XXX'执行删除,因为它正用于复制。错误:'3724' 的解决方案

    关于这个错误,是因为在服务器上想把数据库复制到本地,使用了“发布.订阅”方案,结果后来没成功,删除本地数据库的时候出现了这个错误,说“无法对数据库'XXX'执行删除,因为它正用于复制”. 解决方案:只 ...

  8. [转]How do I run msbuild from the command line using Windows SDK 7.1?

    本文转自:http://stackoverflow.com/questions/6319274/how-do-i-run-msbuild-from-the-command-line-using-win ...

  9. EventBus事件总线框架(发布者/订阅者模式,观察者模式)

    一. android应用内消息传递的方式: 1. handler方式-----------------不同线程间传递消息. 2. Interface接口回调方式-------任意两个对象. 3. In ...

  10. [label][webSites]一个结合Google地图的图片浏览网站

    内容中包含 base64string 图片造成字符过多,拒绝显示