1.了解各种编码的来历及其在计算机内部的存储:

  http://www.cnblogs.com/JohnABC/p/3507219.html

  http://www.ruanyifeng.com/blog/2007/10/ascii_unicode_and_utf-8.html

  http://www.ruanyifeng.com/blog/2014/12/unicode.html

2.了解二进制文件和文本文件的区别: http://www.cnblogs.com/JohnABC/p/3478134.html

3.了解Python的Unicode和Str编码: http://www.cnblogs.com/JohnABC/p/4015504.html

4.在Python中正确使用Unicode: http://www.cnblogs.com/JohnABC/p/4257574.html

根据以上几篇文章总结以下要点:

0.转码时通常以unicode作为中间码, 先将其它编码的祖父次解码成unicode, 再从unicode编码成另一种编码。(string-uicode, bytes-str)

1.str和unicode都是basestring的子类, 严格意义上说, str对象其实是字节串, 它是unicode经过编码后的字节组成的序列, 实际是"8-bit-string", 字节字符串, 类似Java中的byte[], unicode对象等同于Java中的String对象, 本质上是Java的char[]

2.对 UTF-8编码的str'汉'使用len()函数时, 结果是3, 因为实际上, UTF-8编码的'汉' == '\xE6\xB1\x89'

.unicode才是真正意义上的字符串, 对字节串str使用正确的字符编码进行解码后获得, 并且len(u'汉') == 1

.repr()和``做的是完全一样的事情, 它们返回的是一个对象的“官方”字符串表示, 也就是说绝大多数情况下可以通过求值运算(使用内建函数 eval())重新得到该对象, 但str()则有所不同, str()致力于生成一个对象的可读性好的字符串表示, 它的返回结果通常无法用于eval()求值, 但很适合用于print语句输出, 需要再次提醒的是, 并不是所有repr()返回的字符串都能够用eval()内建函数得到原来的对象

5.如果文件是UTF-8编码的, 则以下会报错。因为文件是UTF-8编码的, 所以'你好'是UTF-8编码的, 用gb2312转成unicode是不可能的。

s = "你好"
s.decode("gb2312").encode("utf-8") #UnicodeDecodeError: 'gb2312' codec can't decode bytes in position 2-3:illegal multibyte sequence

6.获得系统的默认编码

#!/usr/bin/env python
#coding=utf-8 import sys
print sys.getdefaultencoding()

a

u = u'汉'
print repr(u) # u'\u6c49'
s = u.encode('UTF-8')
print repr(s) # '\xe6\xb1\x89'
u2 = s.decode('UTF-8')
print repr(u2) # u'\u6c49'

5.使用原则

  • 所有文本字符串都应该是unicode类型,而不是str类型。如果处理的是文本,而变量类型是str,这就是bug了!
  • 若要将字节串解码成字符串,需要使用正确的解码,即var.decode(encoding)(如,var.decode('utf-8'))。将文本字符串编码成字节,使用var.encode(encoding)。
  • 永远不要对unicode字符串使用str(),也不要在不指定编码的情况下就对字节串使用unicode()
  • 当应用从外部读取数据时,应将其视为字节串,即str类型的,接着调用.decode()将其解释成文本。同样,在将文本发送到外部时,总是对文本调用.encode()
  • 如果代码中使用字符串字面值来表示文本,总是应该含有’u'前缀。但实际上,永远不要在代码中定义原始的字符串字面值。不管怎样,我自己是很讨厌这一条,也许其他人也和我一样吧。

Python-编码之大彻大悟的更多相关文章

  1. (转载) 浅谈python编码处理

    最近业务中需要用 Python 写一些脚本.尽管脚本的交互只是命令行 + 日志输出,但是为了让界面友好些,我还是决定用中文输出日志信息. 很快,我就遇到了异常: UnicodeEncodeError: ...

  2. Python 编码简单说

    先说说什么是编码. 编码(encoding)就是把一个字符映射到计算机底层使用的二进制码.编码方案(encoding scheme)规定了字符串是如何编码的. python编码,其实就是对python ...

  3. Python之路3【知识点】白话Python编码和文件操作

    Python文件头部模板 先说个小知识点:如何在创建文件的时候自动添加文件的头部信息! 通过:file--settings 每次都通过file--setings打开设置页面太麻烦了!可以通过:View ...

  4. python编码规范

    python编码规范 文件及目录规范 文件保存为 utf-8 格式. 程序首行必须为编码声明:# -*- coding:utf-8 -*- 文件名全部小写. 代码风格 空格 设置用空格符替换TAB符. ...

  5. 【转】python编码的问题

    摘要: 为了在源代码中支持非ASCII字符,必须在源文件的第一行或者第二行显示地指定编码格式: # coding=utf-8 或者是: #!/usr/bin/python # -*- coding: ...

  6. 【转】python编码规范

    http://blog.csdn.net/willhuo/article/details/49300441 决定开始Python之路了,利用业余时间,争取更深入学习Python.编程语言不是艺术,而是 ...

  7. python 编码 UnicodeDecodeError

    将一个py脚本从Centos转到win运行,出错如下: UnicodeDecodeError: 'gbk' codec can't decode byte 0xff in position 0: il ...

  8. Python编码/文件读取/多线程

    Python编码/文件读取/多线程 个人笔记~~记录才有成长   编码/文件读取/多线程 编码 常用的一般是gbk.utf-8,而在python中字符串一般是用Unicode来操作,这样才能按照单个字 ...

  9. 关于Python编码,超诡异的,我也是醉了

    Python的编码问题,真是让人醉了.最近碰到的问题还真不少.比如中文文件名.csv .python对外呈现不一致啊,感觉好不公平. 没图说个JB,下面立马上图.   我早些时候的其他脚本,csv都是 ...

  10. 规范的python编码

    规范的 python 编码令人赏心悦目,令代码的表达逻辑更清晰,使得工程代码更容易被维护和交流: 编码规范包括对于代码书写格式的约束,不良语法的禁用和推荐的编码手法,下面做些简要的描述: 1. 代码规 ...

随机推荐

  1. 【DFS】【DP】岳麓山上打水

    [vijos1159]岳麓山上打水 描述 今天天气好晴朗,处处好风光,好风光!蝴蝶儿忙啊,蜜蜂也忙,信息组的同学们更加忙.最近,由于XX原因,大家不得不到岳麓山去提水.55555555~,好累啊. 信 ...

  2. HDU 6053 TrickGCD(分块)

    [题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=6053 [题目大意] 给出一个数列每个位置可以取到的最大值, 问这个可以构造多少个数列,使得他们的最 ...

  3. BZOJ 2049 [Sdoi2008]Cave 洞穴勘测(动态树)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2049 [题目大意] 要求支持树的断边和连边,以及连接查询 [题解] LCT练习题 [代 ...

  4. 【tarjan+缩点】POJ1236[IOI1996]-Network of Schools

    [题意] 见:http://blog.csdn.net/ascii991/article/details/7466278 [思路] 缩点+tarjan,思路也可以到上面的博客去看.(吐槽:这道题其实我 ...

  5. 浙南联合训练赛 D - Broken Clock

    You are given a broken clock. You know, that it is supposed to show time in 12- or 24-hours HH:MM fo ...

  6. PHP 5.3.13 memcache win 64 配置和安装

    --环境: windows 2008 R2 64位 wampserver2.2e-php5.3.13-httpd2.2.22-mysql5.5.24-x64 --目标: 实现 php 用memcach ...

  7. jQuery中的Ajax全局事件

    Ajax全局事件 全局事件会在有ajax请求的情况下触发. 方法名称 说明 ajaxStart(callback) Ajax请求开始时执行的函数 ajaxStop(callback) Ajax请求结束 ...

  8. 黑莓10开发101:Native平台

    为黑莓10开发游戏或应用程序有多种方法.这是件好事,不过如果你不是在黑莓平台下进行开发,或者你仅熟悉基于旧的Java的开发平台,也许你会感到无所适从.你将作何选择?从哪里着手? 促成你做出决定的因素有 ...

  9. Android内存优化7 内存检测工具1 Memory Monitor检测内存泄露

    上篇说了一些性能优化的理论部分,主要是回顾一下,有了理论,小平同志又讲了,实践是检验真理的唯一标准,对于内存泄露的问题,现在通过Android Studio自带工具Memory Monitor 检测出 ...

  10. 基于Python的交互式访问

    应用迁移中遇到一些有特殊要求的应用,比如需要通过交互生成一些新的config文件,然后启动应用需要依赖于这些文件,这样在构建镜像的时候基本上是没有办法把这些文件固定的,因为他需要根据运行环境去进行动态 ...