Python 的字符编码
配置: Python 2.7 + Sublime Text 2 + OS X 10.10
本文意在理清各种编码的关系并以此解决 Python 中的编码问题。
1 编码基本概念
只有先了解字符表、编码字符集、字符编码三者的基本概念,才能直入编码问题的核心。
1.1 字符表 | Abstract Character Repertoire
字符表是一个系统支持的所有可读或者可显示的抽象字符的集合。也就是说字符表里面的元素是可显示的字符。例如:“A”、“B”、“文”这样的元素。
1.2 编码字符集 | Coded Character set
编码字符集是这样的一个集合,集合中的元素是字符在字符表中的位置。例如元素 65 代表字符 “A” 在字符表中的位置。
计算机统一使用 Unicode 作为编码字符集。
1.3 字符编码 | Character Encoding Form
由于 Unicode 这个编码字符集十分庞大,每个元素都需要用好几个字节表示,为了节省存储空间以及数据传输成本。人们使用字符编码将 Unicode 表示的字符串转换成字节序列。
将字节序列转换成 Unicode 编码的过程称为解码(decode);将 Unicode 编码转换成字节序列的过程称为编码(encode)。
记住字符编码的目的是为了节省存储空间以及数据传输成本。
常见的字符编码有 ASCII、UTF-8、GBK等,应用最广泛的字符编码是 UTF-8 。
2 Python 的编码字符集
Python 出现的时候 Unicode 的标准还没制定好,所以 Python 2 只支持 ASCII 编码字符集。ASCII 编码字符集和 ASCII 字符编码是同一个集合,也就是说 ASCII 码是没有进行转换直接进行存储的。
所以 Python 中的字符串默认只支持 ASCII 中的字符,为了支持 Unicode 字符,需要在包含 非 ASCII 码字符的字符串前面添加 u,像这样:
u"中文"
3 Python 的字符编码
Python 默认支持的字符编码也是 ASCII,一般都不够用,我们通常希望将其编码为 UTF-8(UTF-8 without BOM),为了实现这一目标,需要在文件头部进行字符编码声明,并将文件保存为 UTF-8 格式。
字符编码声明必须放在文件的前两行,声明方式如下:
# -*- coding:utf-8 -*-
或者,
#coding=utf-8
Python 对这类声明的格式要求比较严格,所在位置错误或者中间多添加空格都会导致声明失效。
如果未添加声明,会出现类似这样的错误
SyntaxError: Non-ASCII character '\xe4' in file .../sample.py on line 4, but no encoding declared; see http://www.python.org/peps/pep-0263.html for details如果添加了 UTF-8 的声明,但是文件保存为 GBK 格式,会出现错误
[Decode error - output not utf-8]。
3.1 Sublime Text 2 编译错误
在 ST2 中,即使进行了正确的设置,依然会出现错误 UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128) 。这是由于 ST2 在输出字符串时无法识别 Python 对标准输入输出的编码,而默认使用了 ASCII 编码,解决方案是这样的,通过 Sublime Text 2 -> Preference -> Browse Packages 找到 Python 文件夹,打开 Python.sublime-build 文件,添加一个 env 域:
"env": {"PYTHONIOENCODING": "utf8"},
另一个解决方案是在 .py 文件中对字符串进行显式的编码,例如:
print u"中文".encode("utf-8")
关于该问题的详细描述参见 有关 Python 2 和 Sublime Text 中文 Unicode 编码问题的分析与理解 。
4 附录
最后添加一个例子以方便理解。
文件 Python.sublime-build :
{
"cmd": ["python2.7", "-u", "$file"],
"path":"/System/Library/Frameworks/Python.framework/Versions/2.7/bin/",
"file_regex": "^[ ]*File \"(...*?)\", line ([0-9]*)",
"env": {"PYTHONIOENCODING": "utf8"},
"selector": "source.python"
}
文件 sample.py :
#! /usr/bin/env python
#coding=utf-8
print u"你好,"
print u"我是唐衣可俊!".encode('utf-8')
输出:
你好,
我是唐衣可俊!
参考链接
十分钟搞清字符集和字符编码(对字符集和字符编码进行了比较系统详尽的介绍)
有关 Python 2 和 Sublime Text 中文 Unicode 编码问题的分析与理解(关于 ST2 对 Unicode 字符输出报错的问题进行了详细的分析)
Python 的字符编码的更多相关文章
- Python基础-字符编码与转码
***了解计算机的底层原理*** Python全栈开发之Python基础-字符编码与转码 需知: 1.在python2默认编码是ASCII, python3里默认是utf-8 2.unicode 分为 ...
- Python的字符编码
Python的字符编码 1. Python字符编码简介 1. 1 ASCII Python解释器在加载.py文件的代码时,会对内容进行编码,一般默认为ASCII码.ASCII(American St ...
- Python常用字符编码(转)
Python常用字符编码 字符编码的常用种类介绍 第一种:ASCII码 ASCII(American Standard Code for Information Interchange,美国信息交 ...
- Python常见字符编码间的转换
主要内容: 1.Unicode 和 UTF-8的爱恨纠葛 2.字符在硬盘上的存储 3.编码的转换 4.验证编码是否转换正确 5.Python bytes类型 前 ...
- python 3字符编码
python 3字符编码 官方链接:http://legacy.python.org/dev/peps/pep-0263/ 在Python2中默认是ascii编码,Python3是utf-8编码 在p ...
- 转:Python常见字符编码及其之间的转换
参考:Python常见字符编码 + Python常见字符编码间的转换 一.Python常见字符编码 字符编码的常用种类介绍 第一种:ASCII码 ASCII(American Standard Cod ...
- Python遇到字符编码出问题的一个相对万能的办法
在使用Python做爬虫的过程中,经常遇到字符编码出问题的情况. UnicodeEncodeError: 'ascii' codec can't encode character u'\u6211' ...
- Python:字符编码详解
相关文章 Python中文编码问题:为何在控制台下输出中文会乱码及其原理 1. 字符编码简介 1.1. ASCII ASCII(American Standard Code for Informati ...
- Python入门笔记(14):Python的字符编码
一.字符编码中ASCII.Unicode和UTF-8的区别 点击阅读:http://www.cnblogs.com/kingstarspe/p/ASCII.html 再推荐一篇相关博文:http:// ...
随机推荐
- 前端flex布局学习笔记
flex布局,即为弹性布局,其为盒模型提供最大的灵活性,任何一个容器都可以指定为flex布局. eg:.box{ display:flex: } 行内元素也可以使用flex布局. 注意:设置flex布 ...
- Vue - 简单实现一个命令式弹窗组件
前言 在日常工作中弹窗组件是很常用的组件,但用得多还是别人的,空闲时间就自己来简单实现一个弹窗组件 涉及知识点:extend.$mount.$el 使用方式: this.$Confirm({ titl ...
- Hybird App 应用开发中5个必备知识点复习
前言 我们大前端团队内部 ?每周一练 的知识复习计划还在继续,本周主题是 <Hybird APP 混合应用专题> ,这期内容比较多,篇幅也相对较长,每个知识点内容也比较多. 之前分享的每周 ...
- 递归的实际业务场景之MySQL 递归查询
喜欢就点个赞呗! 源码<--请点击此处查看 引入 当我看到一些评论时,例如下面的样子.我挺好奇这个功能是怎么样做出来的.进过查阅资料,发现这其实是 MySQL 的递归操作.下面就让我操作一下怎么 ...
- .Net Core 3.0 以及其前版本编写自定义主机,以允许本机程式(转载)
像所有的托管代码一样,.NET Core 应用程序也由主机执行. 主机负责启动运行时(包括 JIT 和垃圾回收器等组件)和调用托管的入口点. 托管 .NET Core 运行时是高级方案,在大多数情况下 ...
- JS基础-事件循环机制
从一道题浅说 JavaScript 的事件循环 原文链接: https://github.com/Advanced-Frontend/Daily-Interview-Question/issues/7 ...
- 3年java开发竟然还不知道Lambda的这个坑
背景 有朋友反馈zk连接很慢.整理出zk连接的关键逻辑如下: 上面的代码造成第一次调用ClientZkAgent.getInstance的时候,需耗时10s, 这个时间恰好跟semaphore的超时时 ...
- poj 2631 Roads in the North (自由树的直径)
Roads in the North Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 4513 Accepted: 215 ...
- Internet History,Technology,and Security -Technology: Application Protocols(Week7)
Week7 Technology: Application Protocols This week, we’ll be covering application protocols. With rel ...
- Mysql服务彪高排查方式及索引的正确使用步骤
原文内容来自于LZ(楼主)的印象笔记,如出现排版异常或图片丢失等问题,可查看当前链接:https://app.yinxiang.com/shard/s17/nl/19391737/12af580d-1 ...