在制作我的App Engine应用程序时,我突然遇到一个错误,显示每一个请求:
run_wsgi_app(application)
File "/home/ubuntu/Programs/google/google_appengine/google/appengine/ext/webapp/util.py", line 98, in run_wsgi_app
run_bare_wsgi_app(add_wsgi_middleware(application))
File "/home/ubuntu/Programs/google/google_appengine/google/appengine/ext/webapp/util.py", line 118, in run_bare_wsgi_app
for data in result:
File "/home/ubuntu/Programs/google/google_appengine/google/appengine/ext/appstats/recording.py", line 897, in appstats_wsgi_wrapper
result = app(environ, appstats_start_response)
File "/home/ubuntu/Programs/google/google_appengine/google/appengine/ext/webapp/_webapp25.py", line 717, in __call__
handler.handle_exception(e, self.__debug)
File "/home/ubuntu/Programs/google/google_appengine/google/appengine/ext/webapp/_webapp25.py", line 463, in handle_exception
self.error(500)
File "/home/ubuntu/Programs/google/google_appengine/google/appengine/ext/webapp/_webapp25.py", line 436, in error
self.response.clear()
File "/home/ubuntu/Programs/google/google_appengine/google/appengine/ext/webapp/_webapp25.py", line 288, in clear
self.out.seek(0)
File "/usr/lib/python2.7/StringIO.py", line 106, in seek
self.buf += ''.join(self.buflist)
UnicodeDecodeError: 'ascii' codec can't decode byte 0xd7 in position 208: ordinal not in range(128)
我真的不知道这可能在哪里,它只会在我使用特定功能时发生,但是我无法跟踪我拥有的所有字符串。
这个字节可能是' " [ ]
等字符,但只能用另一种语言
我如何找到这个字节以及可能的其他字节?
我在ubuntu 11.04中使用python 2.7运行GAE
感谢。
*更新*
这是我最终使用的代码: 从编解码器导入BOM_UTF8 来自os import listdir,path p =“路径”
def loopPath(p, times=0):
for fname in listdir(p):
filePath = path.join(p, fname)
if path.isdir(filePath):
return loopPath(filePath, times+1)
if fname.split('.', 1)[1] != 'py': continue
f = open(filePath, 'r')
ln = 0
for line in f:
#print line[:3] == BOM_UTF8
if not ln and line[:3] == BOM_UTF8:
line = line[4:]
col = 0
for c in list(line):
if ord(c) > 128:
raise Exception('Found "'+line[c]+'" line %d column %d in %s' % (ln+1, col, filePath))
col += 1
ln += 1
f.close()
loopPath(p)
答案 0 :(得分:3)
只需浏览每行代码中的每个字符。这样的事情:
# -*- coding: utf-8 -*-
import sys
data = open(sys.argv[1])
line = 0
for l in data:
line += 1
char = 0
for s in list(unicode(l,'utf-8')):
char += 1
try:
s.encode('ascii')
except:
print 'Non ASCII character at line:%s char:%s' % (line,char)
答案 1 :(得分:1)
当我将UTF-8文件翻译成latin1 LaTeX时,我遇到了类似的问题。我想在我的文件中列出所有邪恶的unicode字符。
你可能需要更多,但我用过这个:
UNICODE_ERRORS = {}
def fortex(exc):
import unicodedata, exceptions
global UNICODE_ERRORS
if not isinstance(exc, exceptions.UnicodeEncodeError):
raise TypeError("don't know how to handle %r" % exc)
l = []
print >>sys.stderr, " UNICODE:", repr(exc.object[max(0,exc.start-20):exc.end+20])
for c in exc.object[exc.start:exc.end]:
uname = unicodedata.name(c, u"0x%x" % ord(c))
l.append(uname)
key = repr(c)
if not UNICODE_ERRORS.has_key(key): UNICODE_ERRORS[key] = [ 1, uname ]
else: UNICODE_ERRORS[key][0] += 1
return (u"\\gpTastatur{%s}" % u", ".join(l), exc.end)
def main():
codecs.register_error("fortex", fortex)
...
fileout = codecs.open(filepath, 'w', DEFAULT_CHARSET, 'fortex')
...
print UNICODE_ERROS
有用吗?
以下是Python doc的匹配摘录:
codecs.register_error(name,error_handler) 在名称名称下注册错误处理函数error_handler。当name被指定为errors参数时,如果出现错误,将在编码和解码期间调用error_handler。
对于编码,将使用UnicodeEncodeError实例调用error_handler,该实例包含有关错误位置的信息。错误处理程序必须引发此异常或其他异常,或者返回一个元组,其中包含输入的不可编码部分的替换以及编码应继续的位置。编码器将对替换进行编码并继续编码指定位置的原始输入。负位置值将被视为相对于输入字符串的结尾。如果结果位置超出范围,将引发IndexError。
答案 2 :(得分:0)
此应列出有问题的行:
grep -v [:alnum:] dodgy_file
$ cat test
/home/ubuntu/tmp/SO/c.awk
$ cat test2
/home/ubuntu/tmp/SO/c.awk
な
$ grep -v [:alnum:] test
$ grep -v [:alnum:] test2
な
答案 3 :(得分:0)
您可以使用命令:
grep --color='auto' -P -n "[\x80-\xFF]" file.xml
这将为您提供行号,并以红色突出显示非ascii字符。
从How do I grep for all non-ASCII characters in UNIX复制。 Fredrik的答案很好但不太正确,因为它也发现了不是字母数字的ASCII字符。
答案 4 :(得分:0)
当该文本被视为一行时,此Python脚本会在文本中提供有问题的字符及其索引:
[(index, char) for (index, char) in enumerate(open('myfile').read()) if ord(char) > 127]