1. 问题描述
在运行Python代码时出现以下问题:
SyntaxError: Non-ASCII character ‘\xe5’ in file 20.valid_parentheses.py on line 29, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details
2. 问题产生原因
这个问题产生的原因:通常是Python2的编译器无法识别中文字符。
在Python2中,文字的默认编码方式是ASCII码,这对亚洲等语言非常不友好,注释难以编码。
在Python3中,文字的默认编码方式是Unicode,采用的传输格式是utf-8。
3. 解决方法
在Python文件的第一行或第二行添加(必须是在源文件的第一行或者第二行)
# -*- coding:utf-8 -*-
这个写法有多种方式,最好使用这一种,这是PEP-0263的建议,因为Emacs等编辑器使用这种方式进行编码声明。
当然,最根本的方法就是直接使用Python3的编译器。Python3在Python2的基础上做了很大改动,更加的好用,建议尽量使用Python3。
4. 知识扩展
-
字符集 计算机只能识别0和1,如果想要显示人类能够轻松易读的符号,或者将人能轻松读出的符号让计算机理解,就需要我们将0、1和人类易读符号进行互相转换。 字符集就是用来做这种转换的规则。常用的有ASCII编码,UNICODE编码等很多其他编码。 -
ASCII编码 ASCII编码最早是美国用的,后来国际化了之后为了兼容其它语言文字做了扩展,这个应该是大家熟知的。 ASCII编码表: -
UNICODE编码 ASCII码无法兼容所有的语言,这是由其编码的位数决定的,8位难以表示所有字符,尤其是汉字。所以很多国家开始研究自己的字符集,包括我国的GB2312、GBK、GB18030。这导致一个问题:每个国家用自己的字符集,那么在进行交流的时候总是需要做字符集的转换。 这个时候ISO(国际标准化组织)出面制定了UNICODE编码,统一采用16位进行编码,编码空间很大;兼容ASCII码,对于其他的编码全部没有提供兼容。这个编码方案的全名是Universal Multiple-Octet Coded Character Set,简称UCS,俗称UNICODE。 -
UTF传输格式 UTF全称是UCS Transfer Format,是UNICODE代码点(code point)的实际表示方式。按照其基本长度占用的位数分为UTF-8/16/32。 尽管UNICODE提供了16位的编码空间,但是仍然不能包含历史上所有的文字,也不能解决传输的问题。所以UNICODE用一些基本的保留字符制定了三套编码方式:UTF-8、UTF-16、UTF-32。 在讨论UNICODE时,搞清楚编码方式非常重要。 UTF-8 以8位序列编码,用一个或几个字节来表示一个字符。可以兼容ASCII编码作为它的一部分。它是变长编码,是压缩的Unicode编码方式,可以节省空间。 UTF-16 UNICODE通常是指UTF-16。它的长度相对固定,不超出范围时用两个字节表示,超出之后用四个字节表示。按照高低位字节顺序,又分为UTF-16BE/UTF-16LE。 UTF-32 长度始终固定,每个Unicode代码点用4字节表示,按照高低位字节顺序又分为UTF-32BE/UTF-32LE。 以UTF-8为例,在传输一个字符时,每次传输8位数据。但是要注意的是,为了保证安全,在传输时UNICODE到UTF是通过一定的算法转换的,并不是直接对应。 UTF-8使用多的原因是:第一,可以容纳所有字符,兼容ASCII码;第二,UTF-8是变长的,更加节省空间。
更多关于Unicode的信息可以参考wiki和Unicode官网介绍。
|