原文:http://lukejin.iteye.com/blog/598303

在处理中文的时候,我们有时候会碰到中文乱码的问题。

究其根本原因是正确的字节序列按照错误的编码方式解码成字符

或者正确的字符被错误的编码成字节序列导致信息的丢失,然后不管如何解码都无法恢复。

字节序列常见于保存在磁盘上的文件,网络中传输的内容等。

如果您对java的字符编码感兴趣的话,

请参见本人另一篇博文 深度剖析java字符编码

一,通过例子理解字符编码

在Python中有两个和字符很相关的类型,一个是str类型,一个是unicode类型。

这两种类型的对象都是sequece序列,其中str是字节序列,而unicode是字符序列

在2.x版本的python中,默认定义的字符串是str类型的。

比如你这么定义

  1. # -*- coding:utf-8 -*-
  2. s=”中文”
  3. us=u”中文”

这样的源码是保存在源码文件中的,其实文件保存在磁盘上的时候都是二进制的字节编码 E4 B8 AD E6 96 87

,只有一定的软件比如文件编辑器打开文件对这些文本的二进制编码进行正确的解码后才能在软件中显示正确,被人们所看懂。

那么在运行的时候是什么样的状态呢?

首先python的运行环境会检测你的源码的编码方式,utf-8

且s的类型是str类型,即字节序列,那么我们需要将”中文”从源码文件中按照utf-8读取成字节序列,那么s在运行的时候就是找个字节序列。其长度len(s)为6,因为utf-8中一个中文需要3个字节E4 B8 AD E6 96 87来表示

而us是unicode字符串,那么在运行的时候,us是“中”和“国”这两个字符的unicode字符\u4E2D \u6587,其长度是2

二.Python中和编码相关的两个函数

在Python中和编码相关的两个函数为decode和encode

在Java中你也会发现这两个类似的方法。

你搜索一下互联网你会发现关于这两个方法的叙述会很多,很多都说的不是很准确。

其中encode()是将某个unicode字符串按照一定的编码方式编码成字节序列

而decode()是一个反过程,将一个字节序列按照一定的编码方式解码成unicode字符串。

这个时候可能有人会问:那么对于一个str类型(已经是字节数组)再应用decode是什么概念呢??

其实str.encode(e) 是和 unicode(str).encode(e)是一样的,python底层做的时候也是确实这么做的。

python这么实现主要是为了方式当某个对象不确定是str还是unicode类型的时候,那么用encode函数总是不会出现错误。

三.Python3000中的字符编码

而在python3k中,所有的str类型的字符串默认就是unicode字符串,字节数组则可以通过bytes类型来表示。这就和java很类似了。

深入理解Python的字符编码的更多相关文章

  1. Python基础-字符编码与转码

    ***了解计算机的底层原理*** Python全栈开发之Python基础-字符编码与转码 需知: 1.在python2默认编码是ASCII, python3里默认是utf-8 2.unicode 分为 ...

  2. Python的字符编码

    Python的字符编码 1. Python字符编码简介 1. 1  ASCII Python解释器在加载.py文件的代码时,会对内容进行编码,一般默认为ASCII码.ASCII(American St ...

  3. Python常见字符编码间的转换

    主要内容:     1.Unicode 和 UTF-8的爱恨纠葛     2.字符在硬盘上的存储     3.编码的转换     4.验证编码是否转换正确     5.Python bytes类型 前 ...

  4. Python 的字符编码

    配置: Python 2.7 + Sublime Text 2 + OS X 10.10 本文意在理清各种编码的关系并以此解决 Python 中的编码问题. 1 编码基本概念 只有先了解字符表.编码字 ...

  5. Python常用字符编码(转)

    Python常用字符编码   字符编码的常用种类介绍 第一种:ASCII码 ASCII(American Standard Code for Information Interchange,美国信息交 ...

  6. python 3字符编码

    python 3字符编码 官方链接:http://legacy.python.org/dev/peps/pep-0263/ 在Python2中默认是ascii编码,Python3是utf-8编码 在p ...

  7. 转:Python常见字符编码及其之间的转换

    参考:Python常见字符编码 + Python常见字符编码间的转换 一.Python常见字符编码 字符编码的常用种类介绍 第一种:ASCII码 ASCII(American Standard Cod ...

  8. Python:字符编码详解

    相关文章 Python中文编码问题:为何在控制台下输出中文会乱码及其原理 1. 字符编码简介 1.1. ASCII ASCII(American Standard Code for Informati ...

  9. 第六节,初识python和字符编码

    程序语言的发展 机器语言 程序语言,最初的计算机语言是机器语言,完全是0和1组成的二进制串  如:01010101 11010101 汇编语言 因为01010101的字符串,冗长,不利于维护,所以产生 ...

随机推荐

  1. JSP之JSTL_functions

    <?xml version="1.0" encoding="UTF-8" ?> <taglib xmlns="http://java ...

  2. SpringMVC的filter怎么使用Autowired依赖注入bean

      有的时候根据我们业务的需要,我们需要在web项目中定义一个自己的filter,并想在这个filter中使用@Autowired注入bean供我们使用.如果直接使用的话是不行的,需要我们在xml文件 ...

  3. [Git] git log命令

    这是git的新系列,不常用的命令和其参数比较容易记不住,干脆将常用的记录下来,日后查查方便也是好的,一篇文章一个git命令,长短根据命令有所不同. git log命令主要用于查看提交历史,同时根据添加 ...

  4. 无废话XML--XML约束(schema)

    Schema  的由来 DTD 作为 XML 1.0 规范的重要组成部分, 对于 XML 文档的结构起到很好的描述作用. 但是,它也具有一些缺点,比如,它采用了非 XML 的语法规则.不支持数据类型. ...

  5. cursor的moveToNext()与moveToFirst()

    String sql = "select count(*) as c from sqlite_master where type ='table' and name ='" + t ...

  6. web技术发展历程--读《大型网站技术架构_核心原理与案例分析》

    1 早期的web服务 2 CGI程序的出现.发展.凋零到MVC的兴起 CGI:通用网关接口技术. 随着CGI技术的出现,web服务端可以通过不同的用户请求产生动态页面内容. web服务器将请求数据交给 ...

  7. iOS9 适配网络请求,适配分享失败,适配无法正常跳转到客户端

    问题描述:在iOS9下,系统默认会拦截对http协议接口的访问,因此无法获取http协议接口的数据.对ShareSDK来说,具体表现可能是,无法授权.分享.获取用户信息等. 还可能造成我们的编辑界面里 ...

  8. Codeforce C. Bus

    C. Bus time limit per test 2 seconds memory limit per test 256 megabytes input standard input output ...

  9. Codeforce B. Polycarp and Letters

    B. Polycarp and Letters time limit per test 2 seconds memory limit per test 256 megabytes input stan ...

  10. Java使用Openoffice将word、ppt转换为PDF

    最近项目中要实现WORD的文件预览功能,我们可以通过将WORD转换成PDF或者HTML,然后通过浏览器预览. OpenOffice OpenOffice.org 是一套跨平台的办公室软件套件,能在 W ...