博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python 的字符编码
阅读量:5097 次
发布时间:2019-06-13

本文共 2301 字,大约阅读时间需要 7 分钟。

配置: 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 。


^^ 版权衔接线 vv    

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")

关于该问题的详细描述参见 。

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-8print u"你好,"print u"我是唐衣可俊!".encode('utf-8')

输出:

你好,我是唐衣可俊!

参考链接

(对字符集和字符编码进行了比较系统详尽的介绍)

(关于 ST2 对 Unicode 字符输出报错的问题进行了详细的分析)

转载于:https://www.cnblogs.com/tangyikejun/p/4495323.html

你可能感兴趣的文章
Master选举原理
查看>>
CSS 基础知识(认识选择器)
查看>>
[ JAVA编程 ] double类型计算精度丢失问题及解决方法
查看>>
Android Token的使用学习
查看>>
小别离
查看>>
★一张图弄明白从零维到十维
查看>>
Java开发学习心得(一):SSM环境搭建
查看>>
固定渲染管线与可编程渲染管线的区别
查看>>
MVC框架
查看>>
微信小程序-发起 HTTPS 请求
查看>>
<Java><!!!><面试题>
查看>>
oracle 11g 导出数据库时,出现空表无法导出问题解决
查看>>
WPF动画设置1(转)
查看>>
backgound-attachment属性学习
查看>>
个人作业——关于K米的产品案例分析
查看>>
基于node/mongo的App Docker化测试环境搭建
查看>>
java web 中base64传输的坑
查看>>
java 中的线程(一)
查看>>
秒杀9种排序算法(JavaScript版)
查看>>
素数判断BFS之“Prime Path”
查看>>