Osc*_*lal 120 python encoding utf-8
我还在学习python,我有一个疑问:
在python 2.6.x中,我通常在文件头中声明编码,如下所示(如PEP 0263)
# -*- coding: utf-8 -*-
Run Code Online (Sandbox Code Playgroud)
在那之后,我的字符串像往常一样写:
a = "A normal string without declared Unicode"
Run Code Online (Sandbox Code Playgroud)
但每次我看到python项目代码时,都不会在标题处声明编码.相反,它在每个字符串声明如下:
a = u"A string with declared Unicode"
Run Code Online (Sandbox Code Playgroud)
有什么不同?这是为了什么目的?我知道Python 2.6.x默认设置ASCII编码,但它可以被头声明覆盖,那么每个字符串声明的重点是什么?
附录:似乎我已将文件编码与字符串编码混合在一起.谢谢你解释:)
Chr*_* B. 164
正如其他人所提到的那样,这是两件不同的事情.
当你指定时# -*- coding: utf-8 -*-,你告诉Python你保存的源文件是utf-8.Python 2的默认值是ASCII(对于Python 3而言utf-8).这只会影响解释器读取文件中字符的方式.
一般来说,无论编码是什么,将高unicode字符嵌入到文件中可能不是最佳选择; 你可以使用字符串unicode转义,它可以在任何编码中使用.
当你声明一个字符串用u在前面,比如u'This is a string',它告诉Python的编译器该字符串是Unicode,而不是字节.这主要由翻译人员透明地处理; 最明显的区别是你现在可以在字符串中嵌入unicode字符(也就是说,u'\u2665'现在是合法的).您可以使用from __future__ import unicode_literals它将其设为默认值.
这仅适用于Python 2; 在Python 3中,默认为Unicode,您需要b在前面指定一个(比如b'These are bytes',声明一个字节序列).
Mar*_*nen 23
正如其他人所说,# coding:指定保存源文件的编码.以下是一些例子来说明这一点:
磁盘上保存的文件为cp437(我的控制台编码),但没有声明编码
b = 'über'
u = u'über'
print b,repr(b)
print u,repr(u)
Run Code Online (Sandbox Code Playgroud)
输出:
File "C:\ex.py", line 1
SyntaxError: Non-ASCII character '\x81' in file C:\ex.py on line 1, but no
encoding declared; see http://www.python.org/peps/pep-0263.html for details
Run Code Online (Sandbox Code Playgroud)
# coding: cp437添加的文件输出:
über '\x81ber'
über u'\xfcber'
Run Code Online (Sandbox Code Playgroud)
起初,Python不知道编码并且抱怨非ASCII字符.一旦知道编码,字节字符串就会获得实际存在于磁盘上的字节.对于Unicode字符串,Python读取\ x81,知道在cp437中是ü,并将其解码为ü的U + 00FC 的Unicode代码点.打印字节字符串时,Python 81直接将十六进制值发送到控制台.当印刷Unicode字符串,Python的正确检测我的控制台的编码作为CP437和翻译的Unicode ü为CP437值ü.
以下是以UTF-8声明和保存的文件所发生的情况:
??ber '\xc3\xbcber'
über u'\xfcber'
Run Code Online (Sandbox Code Playgroud)
在UTF-8中,ü被编码为十六进制字节C3 BC,因此字节字符串包含这些字节,但Unicode字符串与第一个示例相同.Python读取两个字节并正确解码.Python错误地打印了字节字符串,因为它将代表ü的两个UTF-8字节直接发送到我的cp437控制台.
这里的文件声明为cp437,但保存为UTF-8:
??ber '\xc3\xbcber'
??ber u'\u251c\u255dber'
Run Code Online (Sandbox Code Playgroud)
字节字符串仍然在磁盘上获得字节(UTF-8十六进制字节C3 BC),但将它们解释为两个cp437字符而不是一个UTF-8编码字符.这两个字符转换为Unicode代码点,一切打印不正确.
ick*_*fay 10
这不会设置字符串的格式; 它设置文件的格式.即使使用该标头,"hello"也是一个字节字符串,而不是Unicode字符串.要使它成为Unicode,你将不得不在u"hello"任何地方使用它.标题只是提示读取.py文件时使用的格式.
标头定义用于定义代码本身的编码,而不是运行时生成的字符串.
在没有utf-8头定义的python脚本中放置一个非ascii字符如2将会引发警告错误http://www.freeimagehosting.net/uploads/1ed15124c4.jpg
| 归档时间: |
|
| 查看次数: |
152808 次 |
| 最近记录: |