原文: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. CentOS如何把deb转为rpm

    说明:可以转换,但不一定可用,可以根据报错提示,安装需要的依赖. 1 安装alien工具,下载地址http://ftp.de.debian.org/debian/pool/main/a/alien/ ...

  2. 无废话XML--XML约束(DTD)

    基本术语     一.序言Prolog:包括XML声明(XML Declaration)和文档类型声明(Document Type Declaration).     二.良构(well-formed ...

  3. Redis的部署

    笔者Q:972581034 交流群:605799367 欢迎加群交流 官方网站 redis.io 下载 cd /usr/local/src wget http://download.redis.io/ ...

  4. Spring AOP小记

    一.概述 在通常的开发过程中,我们调用的顺序通常是controller->service-dao,其中,service中包含着太多的业务逻辑,并且还要不断调用dao来实现自身的业务逻辑,经常会导 ...

  5. PAT basic level 1001-1019 解题笔记

    1002 写出这个数 采用字符串输入数据,再对每位减去字符‘0’,得到该位相应的整数 int len=s.length();//字符串的长度 ; ;i<len;i++)//每位减去‘0’,逐位相 ...

  6. Git Batch命令(转)

    echo 和 @ 回显命令 @ #关闭单行回显 echo off #从下一行开始关闭回显 @echo off #从本行开始关闭回显.一般批处理第一行都是这个 echo on #从下一行开始打开回显 e ...

  7. 隐藏index.php

    以 Apache 为例,需要在入口文件的同级添加 .htaccess 文件(官方默认自带了该文件),内容如下:<IfModule mod_rewrite.c>Options +Follow ...

  8. SPOJ 1811 LCS [后缀自动机]

    题意: 求两个串的最大连续子串 一个串建SAM,另一个串在上面跑 注意如果走了Suffix Link,sum需要更新为t[u].val+1 Suffix Link有点像失配吧,当前状态s走不了了就到S ...

  9. 【视频编解码·学习笔记】6. H.264码流分析工程创建

    一.准备工作: 新建一个VS工程SimpleH264Analyzer, 修改工程属性参数-> 输出目录:$(SolutionDir)bin\$(Configuration)\,工作目录:$(So ...

  10. js 中的一些小技巧

    js 数字操作: 1.1 取整: 取整有很多方法如: parseInt(a,10); Math.floor(a); a>>0; ~~a; a|0; 前面2种是经常用到的,后面3中算是比较偏 ...