原文: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. 找不到javax.servlet.Filter类,

    找不到javax.servlet.Filter类, 在构建的依赖包中缺少servlet.api

  2. linu_nginx_location语法

    location的作用是什么? 每个server中都需要配置location,通过location匹配域名后内容,再通过location响应同一个域名下不同请求 location语法 location ...

  3. vs Code 运行一个本地WEB服务器

    VS Code作为前端开发工具,值得推荐,用上之后,爱不释手 当我们建立一个全静态的前端项目时,如果需要将整个项目运行起来也非常简单,两步即可: 1.安装npm install -g live-ser ...

  4. linux指令--ls

    本篇博客转自http://www.cnblogs.com/peida/archive/2012/10/23/2734829.html,在原作者基础上做了修改和总结. ls命令是linux下最常用的命令 ...

  5. ORACLE数据库链接

    在ORACLE里面,远程数据访问,像查询.更新等可以通过Database Link来实现.数据库连接需要在建立Database Link的两台机子上都运行Oracle Net(以前叫SQL*NET 和 ...

  6. 换行符\n和回车符\r

    问题始于社区的一个帖子,楼主的问题如下: “在c语言中,对一个不知道大小的文件进行读操作,我用fread()将文件的内容先放到一个缓存区,然后将缓存区中的内容打印出来, 缓存区中的内容和文件中的内容不 ...

  7. [DeeplearningAI笔记]ML strategy_1_1正交化/单一数字评估指标

    机器学习策略 ML strategy 觉得有用的话,欢迎一起讨论相互学习~Follow Me 1.1 什么是ML策略 机器学习策略简介 情景模拟 假设你正在训练一个分类器,你的系统已经达到了90%准确 ...

  8. java之静态代理和动态代理

    我们以几个问题,来开始我们今天的学习,如果下面几个问题,你都能说出个一二,那么恭喜你,你已经掌握了这方面的知识.1,什么是代理模式?2,Java中,静态代理与动态代理的区别?3,Spring使用的是J ...

  9. win7 MySQL Connector/Net 安装卸载问题

    问题1:卸载MySQL Connector Net 6.9.9 卸载程序无法卸载 方法:注册表搜索 MySQL Connector Net 6.9.9 全部删除 ******************* ...

  10. client / page / offset / screen X / Y

    1.clientX / clientY 相对于可视窗口左上角,不包括菜单栏与滚动条 2.pageX / pageY 相对于网页左上角,不包括菜单栏,包括滚动条 3.offsetX / offsetY ...