2011-02-04 56 views
0

我從腳本得到一個編碼錯誤,如下所示:將文本文件從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這樣的東西嗎?如果是這樣的話?

謝謝!

回答

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

該字符位於文件中的位置34935。有用的回溯告訴你。

+0

其實它在渲染輸出的位置,而不是在模板文件。但是這也應該有所幫助。 – AndiDog 2011-02-05 07:58:32

0

\ u2019是一個正確的單引號(http://www.unicode.org/charts/有一個有用的搜索框,您可以輸入代碼),也許這將有助於追蹤它。如果您的文件再次以HTML結尾,您可以使用&#x2019;這些字符的符號。 (正如John指出的那樣,它接受十六進制符號)。

+0

無需轉換;使用'&#x2019` – 2011-02-04 22:08:22

+0

@John:Cheeers,沒有遇到過那個! – 2011-02-05 07:29:00

2

我不知道你爲什麼使用Django的模板引擎來創建控制檯輸出,但是Python wiki顯示了一種方法來解決這個on Windows使用Python-特定的環境變量:

集PYTHONIOENCODING = UTF_8

這將標準輸出/標準錯誤編碼設置爲UTF-8,這意味着你可以打印所有Unicode字符。由於Windows中的命令行編碼通常不是UTF-8,因此您將看到一個類似UTF的序列,而不是特殊字符。例如:

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

不幸的是,我不在Windows上,我在OSX上。 – AP257 2011-02-11 08:31:51