代码如下:
print '"' + title.decode('utf-8', errors='ignore') + '",' \
' "' + title.decode('utf-8', errors='ignore') + '", ' \
'"' + desc.decode('utf-8', errors='ignore') + '")'
title和desc是由Beautiful Soup3 (p.text和p.prettify)返回的,据我从BeautifulSoup3文档中了解,它们都是UTF8编码的。
如果我运行
python.exe script.py > out.txt
我得到以下错误:
Traceback (most recent call last):
File "script.py", line 70, in <module>
'"' + desc.decode('utf-8', errors='ignore') + '")'
UnicodeEncodeError: 'ascii' codec can't encode character u'\xf8' in position 264
: ordinal not in range(128)
但是,如果我运行
python.exe script.py
我没有得到任何错误。只有在指定了输出文件时才会发生这种情况。
如何在输出文件中获得良好的UTF-8数据?
发布于 2012-04-05 04:44:09
您可以使用编解码器模块将unicode数据写入文件
import codecs
file = codecs.open("out.txt", "w", "utf-8")
file.write(something)
‘'print’输出到standart输出,如果您的控制台不支持utf-8,那么即使您通过管道将stdout输出到一个文件,它也会导致这样的错误。
发布于 2012-04-05 06:08:20
这种情况下的Windows行为有点复杂。您应该听取其他建议,并在内部使用unicode作为字符串,并在输入过程中进行解码。
对于您的问题,您需要打印编码的字符串(只有您知道哪种编码!)在标准输出重定向的情况下,但在简单屏幕输出的情况下,您必须打印unicode字符串( python或windows控制台处理到正确编码的转换)。
我建议你这样组织你的脚本:
# -*- coding: utf-8 -*-
import sys, codecs
# set up output encoding
if not sys.stdout.isatty():
# here you can set encoding for your 'out.txt' file
sys.stdout = codecs.getwriter('utf8')(sys.stdout)
# next, you will print all strings in unicode
print u"Unicode string ěščřžý"
更新:另请参阅其他类似问题:Setting the correct encoding when piping stdout in Python
发布于 2012-04-05 05:30:45
为了打印文本而将文本转换为unicode是没有意义的。在unicode中处理您的数据,将其转换为某种编码以进行输出。
您的代码执行的是什么:您使用的是Python2,所以默认的字符串类型(str
)是字节字符串。在您的语句中,您从一些utf编码的字节字符串开始,将它们转换为unicode,然后用引号将它们括起来(为了组合成一个字符串,将常规str
强制转换为unicode )。然后将此unicode字符串传递给print
,后者将其推送到sys.stdout
。为此,它需要将其转换为字节。如果你正在写Windows控制台,它会以某种方式协商,但如果你重定向到一个常规的哑文件,它会回到ascii并抱怨,因为没有不损失的方法可以做到这一点。
解决方案:不要给print
提供unicode字符串。自己将其“编码”为您选择的表示形式:
print "Latin-1:", "unicode über alles!".decode('utf-8').encode('latin-1')
print "Utf-8:", "unicode über alles!".decode('utf-8').encode('utf-8')
print "Windows:", "unicode über alles!".decode('utf-8').encode('cp1252')
当您重定向时,所有这些都应该可以正常工作。它可能在你的屏幕上看起来不对劲,但是用记事本或其他东西打开输出文件,看看你的编辑器是否设置了查看格式。(Utf-8是唯一有希望被检测到的。cp1252可能是Windows默认值)。
一旦你了解了这一点,清理你的代码,并避免使用打印文件输出。使用codecs
模块,并使用codecs.open
打开文件,而不是普通的打开。
PS。如果你正在解码一个utf-8
字符串,转换成unicode应该是无损的:你不需要errors=ignore
标志。当您转换为ascii或拉丁文-2或其他任何格式,并且您只想删除目标代码页中不存在的字符时,这是合适的。
https://stackoverflow.com/questions/10018271
复制相似问题