函数内的Python 2.7 Unicode错误(使用__future__ print_function和unicode_literals)

时间:2013-10-09 13:34:14

标签: python python-2.7 unicode python-unicode

我现在已经阅读了一些关于unicode的帖子。

我使用的是Python 2.7.2,但是使用的是未来的print_function(因为原始的print语句让我很困惑..)

所以这里有一些代码:

# -*- coding: L9 -*-
from __future__ import print_function, unicode_literals

现在如果我打印像

这样的东西
print("öäüߧ€")

它完美无缺。 但是,是的,我是python的新手,如果我声明一个函数,它将打印unicode字符串,它会打击我的脚本

def foo():
    print("öäü߀")

foo()

Traceback (most recent call last):
  File "C:\Python27\test1.py", line 7, in <module>
    foo()
  File "C:\Python27\test1.py", line 5, in foo
    print("÷õ³▀Ç")
  File "C:\Python27\lib\encodings\cp850.py", line 12, in encode
    return codecs.charmap_encode(input,errors,encoding_map)
UnicodeEncodeError: 'charmap' codec can't encode character u'\x80' in position 4: character maps to <undefined>

一般来说,处理此错误和unicode的最佳方法是什么? 我应该坚持使用2.7打印语句吗?

3 个答案:

答案 0 :(得分:1)

我怀疑print("öäü߀".encode('L9'))会解决您的问题。

答案 1 :(得分:0)

控制台代码页使用旧的“OEM”代码页与旧的DOS控制台程序兼容,而Windows的其余部分使用支持现代字符的更新代码页,但仍然因地区而异。在您的情况下,控制台使用cp850,GUI程序使用cp1252cp850不支持Euro字符,因此Python在尝试在控制台上打印字符时会引发异常。如果您需要Euro工作,则可以在运行脚本之前运行chcp 1252。但是,请确保控制台字体支持该字符。

BTW,L9!= cp1252

您确定从控制台打印的是欧元吗?当我剪切并粘贴您的print时,如果代码页为850,我会得到以下内容,但它会在chcp 1252后生效。

>>> print("öäüߧ€")
öäüߧ?                 # Note the ?

编码图表:

答案 2 :(得分:0)

这可能有所帮助:

print(type(s1))
s1.encode('ascii',errors='ignore') #this works
s1.decode('ascii',errors='ignore') #this does not work 

原因是s1.decode无法直接解码unicode,因此首先进行显式的编码调用,但没有errors ='ignore'标志,因此会引发错误

根据您是从文件发出命令还是从具有unicode支持的python提示符发出命令,可以解释为什么在后者中出现错误而不是前者出错。