通过例子来看问题是比较容易懂的。

首先来看,下面这个是我新建的一个txt文件,名字叫做ivan_utf8.txt,然后里面随便编辑了一些东西。

然后来用控制台打开这个文件,同样也是截图:

这里就是简单的打开文本,读取文本内容,打印出来看,我们看到print出来的是和我写进去的是一样的东西。然后呢,我在对这个内容使用decode(‘gbk’),就是解编码,使用gbk方式进行解码,什么意思呢?就是说,我假设这个a是gbk方式的编码,结果是什么呢?大家都看到了,报错了哈!!!!说明这个不是gbk编码,是的,我的编码是utf-8编码,当然要报错啦。。。其实主要是这个里面的中文无法识别,如果只有英文应该还是不会报错的,虽然解出来内容是变样了哈。。。

回到我们这个问题,这个报错是什么意思呢?

这就是牵扯到我们今天要讲的问题了,看完我讲完的内容就能够知道是为什么了。。。

1.python字符串的本质是什么呢?

2.unicode的神奇之处在哪里?

3.python2是怎样处理unicode编码的?

4.python3是怎样处理unicode编码的?

1.为什么python用unicode编码呢?

主要有:

1.处理非英文的内容;

2.可以使用第三方库;

3.接受任何的输入内容;

在网页应用和数据库的交互以及命令行脚本处理都可以用到python。

上面这个报错的例子就是命令行脚本的例子。

大家都知道,其实就是一串字节流(1byte:字节),一个字节就是8位二进制数,10进制的8位是千万,这个二进制的8位就叫做1个字节。1个二进制位只能够表示0或者1。所以1个字节可以表示2的8次方种可能。扯远了。。。。。。。

我们这个字符串时utf-8编码方式编码的。什么叫编码方式呢?就是说这么一串01010101010101……是按照什么样的规则转换成字符的,为什么显示出来会像我们看到的一样?

utf-8就是其中一种规则。

unicode编码每一个字符占两个字节,也就是16个bit位咯!!!如果是其他编码的话,这16bit位可能表示的别的内容。

如今python标准库已经支持100多种编码方式了。

我们不用print,直接a就会看到原始的内容:’sdfs\xe5\xae\xb6\xe9\x87\x8c\xe5\x8f\x91\xe7\x94\x9f\xe7\x9a\x84\xe7\xba\xa0\xe7\xba\xb7'

这个就是在内存中的表示方式,前面的英文可以显示出来,后面的因为是中文,不能够直接翻译出来,人家也不会嘛。。。这些都是16进制,4个2进制只需要1个16进制咯。

utf-8是asciil编码的一种扩展。每个字符是一个字节。所以一个有2的8次方 (2的平房为4,4次方为16,6次方64,8次方就是256),因为是256种可能。但是为什么标准教程上说是128呢?这个等我回去查一下资料再说吧。。可能是ascii库只有128种字符,还有一半的就浪费了哦。

非英文的就不能用ascii来编码,比如说:d = ‘廖’,然后d.encode(d),这样就会爆下面的错:

>>> d.encode('ascii')

Traceback (most recent call last):

File "<stdin>", line 1, in <module>

UnicodeDecodeError: 'ascii' codec can't decode byte 0xe9 in position 0: ordinal not in range(128)

在python中:类型关系如下:

<type 'basestring'>

|

+--<type 'str'>

|

+—<type’unicode'>

对字符串a使用decode(encoding)就会得到unicode类型,a为unicode类型的时候a.encode(encoding)就会得到str类型了。

>>> print a

sdfs家里发生的纠纷

>>> len(a)

25

>>> a[-1]

‘\xb7'

>>> a_uni = a.decode('utf-8')

>>> a_uni

u'sdfs\u5bb6\u91cc\u53d1\u751f\u7684\u7ea0\u7eb7'

>>> type(a_uni)

<type 'unicode'>

>>> len(a_uni)

11

>>> a_uni[-1]

u’\u7eb7'

unicode是:

一种不用字节的形式来表示文本;就是说是变长的,len就是个数。

每次中语言的每一个字符都有唯一的数字来表示。

支持所有主流的语言;

可以表示超过100万的符号;

如果ascii, utf-8 和其他的字节串 是文本,那么unicode就是文本性的,unicode时最严格的文本格式;unicode是最严格的。这是文字的抽象格式。

unicode是一种概念:

为unicode保存到硬盘,就必须进行编码

>>> a = unicode('AB')

>>> type(a)

<type 'unicode'>

>>> a.encode(‘utf-8’)#这就是编码成了utf-8编码了。

'AB'

utf-8

就是变量的多字节表示。

前128个字符就和ascii一样。(其他的1字节表示不了,需要更多字节,一个字符可能需要1-4个字节)

>>> a = unicode('AB')

>>> a.encode('utf-16')

‘\xff\xfeA\x00B\x00’

utf-16

多字节表示。

2-4个字节表示一个字符;

是对2个字节范围内的字符举行优化;

utf-32

固定宽度的字符,最快

4个字节32位表示一个字符;

python不支持

解码文字转换为unicode

大多数情况都是自动的。

这种情况主要发生在第三个库。

python会为你解码的。

往一个ascii编码格式的文件里写入unicode编码的文字时会报错的。

如果要写,可以先将字符a.encode(sys.getdefaultencoding())

python2的默认方式是ascii

可以用:sys.setdefaultencoding(‘utf-8’)来设置python的编码方式。这个设置当次有效。

但是设置会有更多的麻烦。

解码:

1.解码

2.unicode编码无处不在

3.编码

转换为unicode:

def to_unicode_or_bust(obj, encoding = ‘utf-8’):

if isinstance(obj, basestring):

if not isinstance(obj, unicode):

obj = unicode(obj, encoding)

return obj

转换为str类型:

主要用在写入磁盘活着print出来的时候:

直接encode(encoding)即可。

open文件指定编码方式,在第三个参数:

f = open(’1.txt’, ‘r’, encoding = ’utf-8’)

content = f.read()

f.close()

这样就是utf-8的方式读了。写也是一个道理。

python 中的unicode详解的更多相关文章

  1. python中threading模块详解(一)

    python中threading模块详解(一) 来源 http://blog.chinaunix.net/uid-27571599-id-3484048.html threading提供了一个比thr ...

  2. Python中time模块详解

    Python中time模块详解 在平常的代码中,我们常常需要与时间打交道.在Python中,与时间处理有关的模块就包括:time,datetime以及calendar.这篇文章,主要讲解time模块. ...

  3. 第7.19节 Python中的抽象类详解:abstractmethod、abc与真实子类

    第7.19节 Python中的抽象类详解:abstractmethod.abc与真实子类 一.    引言 前面相关的章节已经介绍过,Python中定义某种类型是以实现了该类型对应的协议为标准的,而不 ...

  4. python中常用模块详解二

    log模块的讲解 Python 使用logging模块记录日志涉及四个主要类,使用官方文档中的概括最为合适: logger提供了应用程序可以直接使用的接口API: handler将(logger创建的 ...

  5. 76.Python中F表达式详解

    F表达式是用来优化ORM操作数据库的. 举个例子:我们做口罩的公司要将所有员工的薪水增加2000元,如果按照正常的流程,应该是先从数据库中提取所有的员工的工资到Python内存中,然后使用Python ...

  6. python 中model.py详解

    model详解 Django中遵循 Code Frist 的原则,即:根据代码中定义的类来自动生成数据库表. 创建表 基本结构 from django.db import models # Creat ...

  7. python 中的map 详解

    python中的map函数应用于每一个可迭代的项,返回的是一个结果list.如果有其他的可迭代参数传进来,map函数则会把每一个参数都以相应的处理函数进行迭代处理.map()函数接收两个参数,一个是函 ...

  8. Python 中的设计模式详解之:策略模式

    虽然设计模式与语言无关,但这并不意味着每一个模式都能在每一门语言中使用.<设计模式:可复用面向对象软件的基础>一书中有 23 个模式,其中有 16 个在动态语言中“不见了,或者简化了”. ...

  9. Python中time模块详解(转)

    在平常的代码中,我们常常需要与时间打交道.在Python中,与时间处理有关的模块就包括:time,datetime以及calendar.这篇文章,主要讲解time模块. 在开始之前,首先要说明这几点: ...

随机推荐

  1. java编程思想-java中的并发(二)

    二.共享受限资源 有了并发就可以同时做多件事情了.但是,两个或多个线程彼此互相干涉的问题也就出现了.如果不防范这种冲突,就可能发生两个线程同时试图访问同一个银行账户,或向同一个打印机打印,改变同一个值 ...

  2. nodejs安装及环境配置(windows系统)

    作为服务端运行javascript的平台的NodeJs,把前台javascript移到了服务器端,Google V8引擎使其运行效率非常高,它可以异步,无任何阻塞运行程序.nodejs包含http服务 ...

  3. JavaWeb学习笔记——jsp基础语法

    1.JSP注释 显式注释 <!-- 注释内容 --> 隐式注释,隐式注释在客户端无法看见 // /* */ <% 注释内容 %> 2.Scriptlet(小脚本程序) 所有嵌入 ...

  4. 用Open Live Account写博文的第一篇文章,立个flag

    在设置的时候出了点问题,还好有blog这种神器,直接上网址http://www.cnblogs.com/yishujun/p/5328617.html 高亮插件来自 http://www.cnblog ...

  5. CMD窗口如何调整大小 / 颜色

    Windows默认的命令行工具CMD暴丑无比..很多人都会因为这个原因去寻找漂亮的命令行工具.. 但是很多所谓的命令行工具并不能完美的支持到CMD.. 譬如 PowerCMD 或 Cmder 之流.. ...

  6. [转] Memcached参数设置 命令

    只是看到了..这些命令肯定是没问题的.. 笔者现在也还不会用..汗..先留着..找到怎么用了在回来修改.. memcached的基本设置: -p 监听的端口-l 连接的IP地址, 默认是本机-d st ...

  7. Orchard源码分析(5.3):EndRequest事件处理(DefaultOrchardHost.EndRequest方法)

    EndRequest事件处理的作用是处理完"处理引擎(ProcessingEngine)"中的任务(Task).           void IOrchardHost .EndR ...

  8. Android中Java与JavaScript之间交互(转)

    Android代码: package com.fyfeng.testjavascript; import android.app.Activity; import android.content.In ...

  9. Page传回页面的值问题

  10. asp.net mvc中在使用async的时候HttpContext为null的问题

    摘要 HttpContext上下文并不是无处不在的.详情可以看下Fish Li的文章,解释的比较清楚. HttpContext.Current并非无处不在 问题复现 public async Task ...