设为首页 收藏本站
查看: 977|回复: 0

[经验分享] Python 的字符编码

[复制链接]

尚未签到

发表于 2015-11-30 13:02:28 | 显示全部楼层 |阅读模式
  配置: 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             全文出处:http://www.cnblogs.com/tangyikejun/p/4495323.html   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 字符输出报错的问题进行了详细的分析)

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-145385-1-1.html 上篇帖子: Eclipse开发Python项目 下篇帖子: python核心编程-习题-第二章
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表