将文本文件从UTF-8转换为ASCII以避免python UnicodeEncodeError?

时间:2011-02-04 21:20:51

标签: python character-encoding

我从脚本中收到编码错误,如下所示:

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中编辑的文本文件。我能做些什么来识别和摆脱脚本正在bar的角色?

我可以使用像iconv这样的东西,如果是这样的话?

谢谢!

4 个答案:

答案 0 :(得分: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'

答案 1 :(得分:2)

我不知道为什么你使用Django的模板引擎来创建控制台输出,但是Python wiki显示了一种使用特定于Python的环境变量解决这个on Windows的方法:

  

设置PYTHONIOENCODING = utf_8

这会将stdout / stderr编码设置为UTF-8,这意味着您可以打印所有Unicode字符。由于Windows中的命令行编码通常不是UTF-8,因此您将看到打印的类似UTF的序列而不是特殊字符。例如:

>>> print u'\u2019'
ΓÇÖ

答案 2 :(得分:1)

该字符位于文件中的位置34935。有用的追溯告诉你。

答案 3 :(得分:0)

\ u2019是一个正确的单引号(http://www.unicode.org/charts/有一个有用的搜索框,您可以在其中输入代码),也许这有助于追踪它。如果您的文件再次以HTML格式结束,则可以使用“符号表示这些字符”。 (正如约翰所指出的,这接受了十六进制表示法。)