3

我现在已经阅读了一些关于 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 print 语句吗?

4

3 回答 3

1

I suspect that print("öäü߀".encode('L9')) will solve your problems.

于 2013-10-09T13:39:47.907 回答
0

这可能会有所帮助:

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

原因是 s1.decode 不能直接解码 unicode,所以首先显式调用 encode,但没有 errors='ignore' 标志,因此会引发错误

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

于 2013-10-09T14:19:39.383 回答
0

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

顺便说一句,L9!=cp1252要么。

您确定从控制台打印可以使用欧元吗?当我剪切和粘贴你的print时,如果代码页是 850,我会得到以下信息,但它在chcp 1252.

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

编码图表:

于 2013-10-09T14:17:26.630 回答