这是我的代码:
print '哈哈'.decode('gb2312').encode('utf-8')
...它打印:
SyntaxError: Non-ASCII character '\xe5' in file D:\zjm_code\a.py on line 2, but no encoding declared; see http://www.python.org/peps/pep-0263.html for details
How do I print '哈哈'?
更新:当我使用以下代码时:
#!/usr/bin/python
# -*- coding: utf-8 -*-
print '哈哈'
...它打印鍝堝搱
。这不是我想要的。
我的IDE是Ulipad,这是IDE的错误吗?
第二次更新:
此代码将正确打印字符:
#!/usr/bin/python
# -*- coding: utf-8 -*-
print u'哈哈'.encode('gb2312')
......当我用它时:
#!/usr/bin/python
# -*- coding: utf-8 -*-
a='哈哈'
print a.encode('gb2312')
Traceback (most recent call last):
File "D:\zjm_code\a.py", line 5, in <module>
print a.encode('gb2312')
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe5 in position 0: ordinal not in range(128)
...要么...
#!/usr/bin/python
# -*- coding: utf-8 -*-
a='哈哈'
print unicode(a).encode('gb2312')
Traceback (most recent call last):
File "D:\zjm_code\a.py", line 5, in <module>
print unicode(a).encode('gb2312')
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe5 in position 0: ordinal not in range(128)
......它不起作用。如何正确打印变量a
?
谢谢
您首先需要声明一个编码,因为错误消息说得很清楚 - 它甚至会告诉您查看here以获取详细信息!你的编码可能是gb2312
。
顺便说一下,它会更简单(使用相同的编码声明)
print u'哈哈'.encode('utf-8')
你可能甚至不需要encode
部分,如果你的sys.stdout
有一个正确设置的encoding
属性(取决于你的终端,操作系统等)。
你需要指定python源代码文件的编码,这里是utf-8的编码。它位于python解释器路径下方的右上角。
#!/usr/bin/python
# -*- coding: utf-8 -*-
如果你去url in the error message,你可以找到有关指定python源文件编码的更多信息。
指定源文件的编码后,您不必解码文本。
以下代码适用于我:
# coding: utf8
print u'哈哈'.encode('utf-8')
#coding
注释告诉Python文件本身的编码,因此您可以直接在其中嵌入UTF-8字符。如果从Unicode字符串开始,则无需对其进行解码并对其进行重新编码。
根据Will McCutchen的回答,这也有效:
# coding: utf8
print '哈哈'
你不能对unicode字符进行编码。 Encode用于将unicode中编码的所有字符转换为其他代码样式。它不能用于unicode字符。
在争议的方式中,解码只能用于在unicode中编码的字符转换为unicode字符。
如果在字符串之前声明一个带有'u'字符的字符串,您将获得以unicode编码的字符串。您可以使用isinstance(str,unicode)来检测str是否以unicode编码。
请尝试以下代码。提示:在Windows中文版中,默认代码样式为“gbk”。
>>> a = '哈哈' >>> b = u'哈哈' >>> isinstance(a,unicode) False >>> isinstance(b,unicode) True
>>> a '\ xb9 \ XFE \ xb9 \ XFE' >>> b U '\ u54c8 \ u54c8'
>>> a.decode('gbk') U '\ u54c8 \ u54c8' >>> a_unicode = a.decode('gbk') >>> a_unicode U '\ u54c8 \ u54c8'
>>>打印a_unicode 哈哈 >>> a_unicode.encode('gbk')== a 真正 >>> a_unicode == b 真正
>>> a.encode('gbk') 回溯(最近一次调用最后一次):文件“”,第1行,在UnicodeDecodeError中:'ascii'编解码器无法解码位置0中的字节0xb9:序数不在范围内(128)
>>> b.decode('gbk') 回溯(最近一次调用最后一次):文件“”,第1行,在UnicodeEncodeError中:'ascii'编解码器不能编码位置0-1中的字符:序数不在范围内(128)
你应该检查终端字符编码。
在我的终端上,首先我将字符编码设置为utf-8,一切都很好。
当我将其设置为GBK时,结果是'鍝埚'。