Python 即使在使用utf-8编码后也会出现ascii码错误
我正在向github的api发布降价信息,并在post请求中发送json数据。我发现我不能写列表,因为这些字符不是ascii的一部分,我查了一下,发现我应该一直编码。我对需要标记的文本进行了编码,api正在工作,但当我尝试创建列表时,仍然会遇到相同的错误 POST方法的代码为: 当我尝试制作列表时,我得到的错误如下:Python 即使在使用utf-8编码后也会出现ascii码错误,python,google-app-engine,encoding,utf-8,Python,Google App Engine,Encoding,Utf 8,我正在向github的api发布降价信息,并在post请求中发送json数据。我发现我不能写列表,因为这些字符不是ascii的一部分,我查了一下,发现我应该一直编码。我对需要标记的文本进行了编码,api正在工作,但当我尝试创建列表时,仍然会遇到相同的错误 POST方法的代码为: 当我尝试制作列表时,我得到的错误如下: 'ascii' codec can't decode byte 0xe2 in position 55: ordinal not in range(128) 添加完整的回溯:
'ascii' codec can't decode byte 0xe2 in position 55: ordinal not in range(128)
添加完整的回溯:
Traceback (most recent call last):
File "/home/bigb/Programming/google_appengine/google/appengine/runtime/wsgi.py", line 266, in Handle
result = handler(dict(self._environ), self._StartResponse)
File "/home/bigb/Programming/google_appengine/lib/webapp2-2.3/webapp2.py", line 1519, in __call__
response = self._internal_error(e)
File "/home/bigb/Programming/google_appengine/lib/webapp2-2.3/webapp2.py", line 1511, in __call__
rv = self.handle_exception(request, response, e)
File "/home/bigb/Programming/google_appengine/lib/webapp2-2.3/webapp2.py", line 1505, in __call__
rv = self.router.dispatch(request, response)
File "/home/bigb/Programming/google_appengine/lib/webapp2-2.3/webapp2.py", line 1253, in default_dispatcher
return route.handler_adapter(request, response)
File "/home/bigb/Programming/google_appengine/lib/webapp2-2.3/webapp2.py", line 1077, in __call__
return handler.dispatch()
File "/home/bigb/Programming/google_appengine/lib/webapp2-2.3/webapp2.py", line 547, in dispatch
return self.handle_exception(e, self.app.debug)
File "/home/bigb/Programming/google_appengine/lib/webapp2-2.3/webapp2.py", line 545, in dispatch
return method(*args, **kwargs)
File "/home/bigb/Programming/Blog/my-ramblings/blog.py", line 232, in post
mark_blog = markDown(blog)
File "/home/bigb/Programming/Blog/my-ramblings/blog.py", line 43, in markDown
text = to_mark.decode('utf8')
File "/usr/lib/python2.7/encodings/utf_8.py", line 16, in decode
return codecs.utf_8_decode(input, errors, True)
UnicodeEncodeError: 'ascii' codec can't encode characters in position 45-46: ordinal not in range(128)
我是不是理解错了?谢谢 我记不清了,但当我遇到完全相同的错误时,可能在response.read()中使用decode/encode对我有效
response.read().decode("utf8")
您的
to_mark
值不是Unicode值;您已经在那里对字节字符串进行了编码。尝试对字节字符串进行编码告诉Python,在再次编码之前,它应该首先将值解码为Unicode。这会导致您的异常:
>>> '\xc3\xa5'.encode('utf8')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 0: ordinal not in range(128)
您的代码片段如下所示:
text = to_mark.encode('utf-8')
但在回溯中,您有:
File "/home/bigb/Programming/Blog/my-ramblings/blog.py", line 43, in markDown
text = to_mark.decode('utf8')
请首先确保发布真实代码并进行回溯(即:发布实际引发异常的代码)。请包含完整的回溯。请注意,对于不需要编码的
json.dumps()
,库将为您处理编码。这不是问题的原因。您确定to_mark
是Unicode值吗?to_mark
是来自文本区域以提交新帖子的值。我使用的是jinja2和autoescape,无论提交什么内容。这并不意味着to_mark
是一个unicode值。它将是一个字节字符串,由浏览器编码以匹配表单内容类型(通常为UTF8)。您的回溯与您发布的代码无关。您正在将bytestring值存储在Unicode字段中,subject
或mark_blog
或两者都存储。例外情况适用于在某处强制使用的Unicode值;为什么在另一个地方将字节解码为Unicode可以解决这个问题?即使这是一个问题,为什么UTF8会在这里工作?这是一个很大的假设。所以如果我理解正确,字节字符串已经被编码了?undicode是字节字符串的解码版本吗?我刚试过,我还是会犯同样的错误是的,你已经做到了。Python字符串是编码数据;unicode值被解码。类似于包含数字和整数的字符串,或者表示日期和时间与datetime
对象的字符串。看到了,我真的读了,也读了。对不起,当我根据Martjin的建议将它改为解码时,我没有编辑它。现在编辑。
text = to_mark.encode('utf-8')
File "/home/bigb/Programming/Blog/my-ramblings/blog.py", line 43, in markDown
text = to_mark.decode('utf8')