1

我在 Windows XP 的简体中文版上有 Python 2.7.1,我有一个这样的程序(windows_prn_utf8.py):

#!/usr/bin/env python
# -*- coding: utf8 -*-

print unicode('\xE7\x94\xB5', 'utf8')

如果我在 Windows CMD 控制台上运行它,它会输出正确的汉字 '电' ;但是,如果我尝试将命令输出重定向到文件。我有错误。

D:\Temp>windows_prn_utf8.py > 1.txt
Traceback (most recent call last):
  File "D:\Temp\windows_prn_utf8.py", line 4, in <module>
    print unicode('\xE7\x94\xB5', 'utf8')
UnicodeEncodeError: 'ascii' codec can't encode character u'\u7535' in position 0: ordinal not in range(128)

我意识到这里缺少一个链接。应该有办法确定,万一生成1.txt,1.txt中的unicode字符是用utf-8编码还是codepage-936编码或者其他编码。

那么如何解决呢?我的偏好是在 1.txt 中使用 utf-8 编码。谢谢你。

在此处输入图像描述

4

4 回答 4

3

似乎这已经解决了,但我认为更多细节将有助于解释这个实际问题。

'utf8' inunicode('\xE7\x94\xB5', 'utf8')告诉解释器如何解码您在另一个参数中提供的 3 个字节,以便在内部将字符表示为 unicode 对象:

In [6]: uobj = unicode('\xe7\x94\xb5','utf8')

In [7]: uobj
Out[7]: u'\u7535'

另一个例子是从它的 utf-16 表示创建相同的字符(这是 python 默认显示的,Out[7]如上一行所示):

In [8]: uobj = unicode('\x35\x75','utf16')

In [9]: uobj
Out[9]: u'\u7535'

在创建对象后的示例中,它成为print尝试将其写入标准输出(控制台窗口,重定向到文件等)的参数。复杂之处在于print必须在写入之前将该对象重新编码为字节流。在您的情况下,它默认使用的编码似乎是 ACSII,它不能代表该字符。

(如果控制台尝试显示字符,它们将在窗口中重新解码并替换为相应的字体字形——这就是为什么您的输出和控制台都需要“说出”相同的编码。)

从我在 Windows 中看到的 cmd.exe 在字符编码方面非常令人困惑,但我在其他操作系统上所做的是在使用 unicode 对象的encode函数打印/写入字节之前显式编码字节。这将返回存储在str对象中的编码字节序列:

In [10]: sobj = uobj.encode('utf8')

In [11]: type(sobj)
Out[11]: str

In [12]: sobj
Out[12]: '\xe7\x94\xb5'

In [13]: print sobj
电

现在print给出的是 astr而不是 a unicode,它不需要编码任何东西。在我的情况下,我的终端正在解码 utf8,它的字体包含那个特定的字符,所以它正确地显示在我的屏幕上(希望现在就在你的浏览器中)。

于 2016-01-07T18:53:03.990 回答
1

设置PYTHONIOENCODING环境变量。

SET PYTHONIOENCODING=cp936
windows_prn_utf8.py > 1.txt
于 2013-07-29T08:01:42.673 回答
1

您可以在将其写入文件之前将其编码为 utf-8。

f.write("电".encode("utf8"))
于 2013-07-29T08:11:04.393 回答
1

使用 codecs.open(filename,encoding) 而不是 open(filename) 并使用 python 写入文件。

于 2013-07-29T08:12:35.540 回答