将文本文件从UTF-8转换为ASCII以避免Python UnicodeEncodeError?
我在运行一个脚本的时候遇到了编码错误,错误信息如下:
from django.template import loader, Context
t = loader.get_template(filename)
c = Context({'menus': menus})
print t.render(c)
File "../django_to_html.py", line 45, in <module>
print t.render(c)
UnicodeEncodeError: 'ascii' codec can't encode character u'\u2019' in position 34935: ordinal not in range(128)
我并不拥有这个脚本,所以不能直接修改它。我能做的就是更改提供的filename
,确保它不包含那个让脚本出错的Unicode字符。
这个文件是一个文本文件,我是在TextMate中编辑的。我该怎么做才能找到并去掉那个让脚本出错的字符呢?
我可以使用像iconv这样的工具吗?如果可以的话,应该怎么用?
谢谢!
4 个回答
1
这个字符在文件的第34935个位置。这个有用的错误提示告诉你这一点。
2
我不太明白你为什么要用Django的模板引擎来生成控制台输出,不过Python的维基上有个方法可以解决这个问题,特别是在Windows系统上,你可以使用一个Python特定的环境变量:
set PYTHONIOENCODING=utf_8
这个命令会把标准输出和标准错误的编码设置为UTF-8,这样你就可以打印出所有的Unicode字符了。因为在Windows的命令行中,默认的编码通常不是UTF-8,所以你会看到一些特殊字符被打印成类似UTF的序列。例如:
>>> print u'\u2019'
ΓÇÖ
3
如何在你的文件中找到所有的问题:
import unicodedata as ucd
import sys
with open(sys.argv[1]) as f:
for linex, line in enumerate(f):
uline = line.decode('UTF-8')
bad_line = False
for charx, char in enumerate(uline):
if char <= u'\xff': continue
print "line %d, column %d: %s" % (
linex+1, charx+1, ucd.name(char, '<unknown>'))
bad_line = True
if bad_line:
print repr(uline)
print
示例输出:
line 1, column 6: RIGHT SINGLE QUOTATION MARK
line 1, column 10: SINGLE LOW-9 QUOTATION MARK
u'yadda\u2019foo\u201abar\r\n'
line 2, column 4: IDEOGRAPHIC SPACE
u'fat\u3000space\r\n'