首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python: UnicodeEncodeError 'ascii‘编解码器

Python: UnicodeEncodeError 'ascii‘编解码器
EN

Stack Overflow用户
提问于 2014-01-13 09:07:14
回答 1查看 1.1K关注 0票数 0

我只是希望python代码能够工作,但是这些转换错误我不明白(我总是得到某种类型的'ascii‘编码或解码错误)。我疯了,在线的每一部分做了一个解码和编码,这仍然给我带来麻烦。如果您愿意更正它,可以在https://github.com/TBOpen/papercut通过GIT获得(我还解决了一个类似的错误,没有在第885行使用self.wfile.write(message.decode('cp1250', 'replace').encode('ascii', 'replace') + "\r\n")签入)。

然而,这是一个我无法解决的问题的回溯(在那里我放弃了)。

代码语言:javascript
复制
Traceback (most recent call last):
  File "/usr/local/lib/python2.6/SocketServer.py", line 535, in process_request
    self.finish_request(request, client_address)
  File "/usr/local/lib/python2.6/SocketServer.py", line 320, in finish_request
    self.RequestHandlerClass(request, client_address, self)
  File "/usr/local/lib/python2.6/SocketServer.py", line 615, in __init__
    self.handle()
  File "./papercut.py", line 221, in handle
    getattr(self, "do_%s" % (command))()
  File "./papercut.py", line 410, in do_ARTICLE
    self.send_response("%s\r\n%s\r\n\r\n%s\r\n.".decode('cp1250', 'replace').encode('ascii', 'replace') % (response.decode('cp1250', 'replace').encode('ascii', 'replace'), result[0].decode('cp1250', 'replace').encode('ascii', 'replace'), result[1].decode('cp1250', 'replace').encode('ascii', 'replace')))
  File "/usr/local/lib/python2.6/encodings/cp1250.py", line 15, in decode
    return codecs.charmap_decode(input,errors,decoding_table)
UnicodeEncodeError: 'ascii' codec can't encode character u'\u2122' in position 20: ordinal not in range(128)

蒂娅!!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-01-13 09:15:59

根本问题是,responseresult[0]result[1]中的一个实际上是unicode字符串,而不是编码的str字符串。

因此,当您调用(任意选择一个) response.decode('cp1250', 'replace')时,您要求对已经解码为Unicode的内容进行解码。Python2.x所做的是首先将其编码为默认编码(ASCII),以便它能够根据您的请求对其进行解码。这就是为什么你要打电话给UnicodeEncodeError decode.*的原因

要解决这个问题,你必须弄清楚这三个中哪一个是错的,以及原因。如果语句中包含4个解码调用,这是不可能的,但是如果将其分解为单独的语句,或者添加一些print调试,在这些变量被使用之前查看其中的内容,这是不可能的。

然而,这将使您的生活更容易完全重组您的代码。而不是在整个地方来回转换,给自己几十个地方来犯一个简单的错误,最终导致程序中途出现不可调试的错误,只需在输入时对所有输入进行解码,以Unicode方式处理所有内容,然后在输出时对所有内容进行编码。

顺便说一句,如果您还没有读过Python的Unicode方法和博客文章每个软件开发人员绝对、积极的绝对最低限度必须了解Unicode和字符集(没有借口!),那么先读一读,再做进一步的介绍。

*如果您认为这是语言…的愚蠢设计这就是Python 3存在的主要原因。在Python3中,您不能decode a unicodeencode a bytes,因此错误会尽早出现,并告诉您到底出了什么问题,而不是让您试图查找在错误类型上调用错误方法的位置,并得到一个没有意义的错误。因此,如果您想使用Python 2而不是3,您不会抱怨Python 2的设计比3的设计更愚蠢。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21087311

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档