ims*_*rch 1 python unicode encoding
我对 python 2.7 中的编码有一些疑问。
1.python代码如下,
#s = u"?"
s = u'\u4e25'
print 's is:', s
print 'len of s is:', len(s)
s1 = "a" + s
print 's1 is:', s1
print 'len of s1 is:', len(s1)
Run Code Online (Sandbox Code Playgroud)
输出是:
s is: ?
len of s is: 1
s1 is: a?
len of s1 is: 2
Run Code Online (Sandbox Code Playgroud)
我很困惑,为什么 lens是 1,怎么可能4e25存储在 1 个字节中?我还注意到 USC-2 是 2 字节长而 USC-4 是 4 字节长,为什么 unicode strings的长度是 1?
2. (1)新建一个以a.pynotepad++命名的文件(Windows 7),并设置文件的编码ANSI,代码a.py如下:
# -*- encoding:utf-8 -*-
import sys
print sys.getdefaultencoding()
s = "?"
print "s:", s
print "type of s:", type(s)
Run Code Online (Sandbox Code Playgroud)
输出是:
ascii
s: ?
type of s: <type 'str'>
Run Code Online (Sandbox Code Playgroud)
(2)新建一个以b.pynotepad++命名的文件(Windows 7),并设置文件的编码UTF-8,代码b.py如下:
# -*- encoding:gbk -*-
import sys
print sys.getdefaultencoding()
s = "?"
print "s:", s
print "type of s:", type(s)
Run Code Online (Sandbox Code Playgroud)
输出是:
File "D:\pyws\code\\b.py", line 1
SyntaxError: encoding problem: utf-8
Run Code Online (Sandbox Code Playgroud)
(3) 更改文件b.py如下(文件的编码样式为UTF-8):
import sys
print sys.getdefaultencoding()
s = "?"
print "s:", s
print "type of s:", type(s)
Run Code Online (Sandbox Code Playgroud)
输出是:
ascii
s: ?
type of s: <type 'str'>
Run Code Online (Sandbox Code Playgroud)
(4)更改文件a.py如下(文件的编码风格为ANSI):
import sys
print sys.getdefaultencoding()
s = "?"
print "s:", s
print "type of s:", type(s)
Run Code Online (Sandbox Code Playgroud)
输出是:
File "D:\pyws\code\a1.py", line 3
SyntaxError: Non-ASCII character '\xd1' in file D:\pyws\code\a1.py on
line 3, but no encoding declared; see http://www.python.org/peps/pep-0263.html f
or details
Run Code Online (Sandbox Code Playgroud)
为什么question2中这4个案例的输出不同?有大佬能详细解一下吗?
我很困惑,为什么 s 的 len 是 1,如何将 4e25 存储在 1 个字节中?我还注意到 USC-2 是 2 字节长而 USC-4 是 4 字节长,为什么 unicode 字符串 s 的长度是 1?
unicode 字符串的全部意义在于做到这一点。unicode 字符串的长度是字符数(即代码点),而不是字节数。字节数可能因编码而异,但字符数是一个抽象的不变量,不会随着编码而改变。
至于您的第二个问题,答案是在设置文件的编码时,您是在告诉 Python 如何将该文件中的字节映射到字符。如果您指定的编码(使用# encoding语法)与文件的实际编码不一致,您将获得不可预测的行为,因为 Python 试图以一种方式解释字节,但文件已设置,因此字节实际上意味着其他含义。
您获得的行为类型取决于您使用的编码的细节。一些可能性是:
# encoding在文件中设置了该效果的指令吗?)此外,字符串的类型str在所有情况下都是如此,因为您没有将字符串指定为 unicode(例如,with u"...")。指定文件编码不会使字符串成为 unicode。它只是告诉 Python 如何解释文件中的字符。
然而,这里有一个更大的问题,那就是:你为什么在你的例子中玩那些带有编码的游戏?没有任何理由使用# encoding标记来指定文件实际编码以外的编码,这样做肯定会导致问题。不要这样做。您必须知道文件采用什么编码,并在# encoding标记中指定相同的编码。
| 归档时间: |
|
| 查看次数: |
6120 次 |
| 最近记录: |