EDIT:(此编辑与上一个编辑之间的主要变化...注意:我在 Ubuntu 机器上使用 Python 2.6.4。)
首先,在我第一次尝试回答时,我提供了一些一般信息print
and str
我将把它留在下面,以方便任何遇到更简单问题的人print
并偶然想到这个问题。至于处理OP遇到的问题的新尝试......基本上,我倾向于说这里没有灵丹妙药,如果print
以某种方式设法理解奇怪的字符串文字,那么这不是可重现的行为。我通过终端窗口中与 Python 的以下有趣交互得出了这个结论:
>>> print '\xaa\xbb\xcc'
��
您是否尝试过直接从终端输入ª»Ì?在使用 utf-8 作为编码的 Linux 终端上,这实际上是作为 6 个字节读取的,然后可以借助以下命令使其看起来像三个 unicode 字符:decode
method:
>>> 'ª»Ì'
'\xc2\xaa\xc2\xbb\xc3\x8c'
>>> 'ª»Ì'.decode(sys.stdin.encoding)
u'\xaa\xbb\xcc'
So, the '\xaa\xbb\xcc'
文字只有在解码时才有意义作为 latin-1 文字(好吧,实际上您可以使用与相关字符上的 latin-1 一致的不同编码)。至于print
在你的情况下“只是工作”,它当然不适合我 - 如上所述。
这是因为当您使用不带前缀的字符串文字时u
- IE。"asdf"
而不是u"asdf"
-- 生成的字符串将使用一些非 unicode 编码。不;事实上,字符串对象本身是不知道编码的,并且您必须将其视为使用编码 x 进行编码,以获得正确的 x 值。这个基本想法使我得出以下结论:
a = '\xAA\xBB\xCC'
a.decode('latin1')
# result: u'\xAA\xBB\xCC'
print(a.decode('latin1'))
# output: ª»Ì
请注意,没有解码错误和正确的输出(我希望在任何其他盒子上都能保持正确的输出)。显然,Python 可以理解你的字符串文字,但需要一些帮助。
这有帮助吗? (至少在理解事情是如何工作的方面,如果不是让编码的处理变得更容易的话......)
现在来看一些具有解释价值的有趣片段(希望如此)!这对我来说效果很好:
sys.stdout.write("\xAA\xBB\xCC".decode('latin1').encode(sys.stdout.encoding))
跳过解码或编码部分会导致与 unicode 相关的异常。从理论上讲,这是有道理的,因为需要第一次解码来决定给定字符串中有哪些字符(乍一看唯一明显的是bytes有——Python 3 的想法是用(unicode)字符串表示字符,用字节表示字节,突然间似乎非常合理),同时需要编码,以便输出尊重输出流的编码。现在这个
sys.stdout.write("ąöî\n".decode(sys.stdin.encoding).encode(sys.stdout.encoding))
也按预期工作,但字符实际上来自键盘,因此实际上是使用 stdin 编码进行编码的...此外,
ord('ą'.decode('utf-8').encode('latin2'))
返回正确的 177 (我的输入编码是 utf-8),但是 '\xc4\x85'.encode('latin2') 对 Python 没有任何意义,因为它不知道如何理解 '\xc4\ x85' 并认为尝试'ascii' 代码是它能做的最好的事情。
原答案:
相关位 http://docs.python.org/library/functions.html#printPython 文档(版本 2.6.4)说print(obj)
是为了打印出由给出的字符串str(obj)
。我想你可以把它包装在一个电话中unicode
(as in unicode(str(obj))
)来获取 unicode 字符串——或者您可以只使用 Python 3 并将这个特定的麻烦替换为几个不同的字符串。 ;-)
顺便说一句,这表明您可以操纵结果print
调用一个对象就像操作调用的结果一样str
在一个物体上,即通过弄乱__str__
方法。例子:
class Foo(object):
def __str__(self):
return "I'm a Foo!"
print Foo()
至于实际执行情况print
,我预计这根本没有用,但如果你really想知道发生了什么......它在文件中Python/bltinmodule.c
在 Python 源代码中(我正在查看版本 2.6.4)。搜索以以下内容开头的行builtin_print
。实际上,这非常简单,没有任何魔法。 :-)
希望这能回答您的问题...但是,如果您确实有一个我完全忽略的更神秘的问题,请发表评论,我将进行第二次尝试。另外,我假设我们正在处理 Python 2.x;否则我想我不会有有用的评论。