编码提供“ascii”编码解码器无法编码字符…序号不在范围(128)内”

2024-06-01 21:12:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在完成Django RSS阅读器项目here

RSS提要将读到类似“俄克拉何马城(美联社)-詹姆斯哈登让”。RSS提要的编码读取encoding=“UTF-8”,因此我相信我正在传递UTF-8以在下面的代码片段中标记。紧急冲刺是它窒息的地方。

我得到一个Django错误“'ascii'编解码器无法对位置109中的字符u'\u2014'进行编码:序号不在范围(128)”这是UnicodeEncodeError。在传递的变量中,我看到了“俄克拉何马城(俄克拉何马州)詹姆斯哈登”。无法工作的代码行是:

content = content.encode(parsed_feed.encoding, "xmlcharrefreplace")

我正在使用Markdow2.0、Django1.1和Python2.4。

我需要做的编码和解码的神奇顺序是什么?


(回应普罗米修斯的请求。我同意格式的帮助)

所以在视图中,我在解析的feed编码行上方添加了一个智能的unicode行。。。

content = smart_unicode(content, encoding='utf-8', strings_only=False, errors='strict')
content = content = content.encode(parsed_feed.encoding, "xmlcharrefreplace") 

这就把问题推到了我的models.py上

def save(self, force_insert=False, force_update=False): 
     if self.excerpt: 
         self.excerpt_html = markdown(self.excerpt) 
         # super save after this 

如果我把保存方法改成。。。

def save(self, force_insert=False, force_update=False): 
     if self.excerpt: 
         encoded_excerpt_html = (self.excerpt).encode('utf-8') 
         self.excerpt_html = markdown(encoded_excerpt_html)

我得到一个错误“'ascii'编解码器无法解码位置141中的字节0xe2:ordinal not in range(128)”,因为现在它在em破折号所在的位置读取“\xe2\x80\x94”


Tags: django代码selffalse编码savehtmlfeed
3条回答

我在使用zip文件写入文件名时遇到此错误。以下操作失败

ZipFile.write(root+'/%s'%file, newRoot + '/%s'%file)

接下来的工作

ZipFile.write(str(root+'/%s'%file), str(newRoot + '/%s'%file))

如果您接收的数据实际上是用UTF-8编码的,那么它应该是一个字节序列——Python 2.X中的Python“str”对象

您可以使用断言来验证这一点:

assert isinstance(content, str)

一旦你知道这是真的,你可以移动到实际的编码。Python不做代码转换——例如,直接从UTF-8转换到ASCII。首先需要将字节序列解码为Unicode字符串:

unicode_content = content.decode('utf-8')

(如果您可以信任解析的feed.encoding,那么使用它而不是文本“utf-8”。不管怎样,都要为错误做好准备。)

然后,您可以获取该字符串,并将其编码为ASCII,用它们的XML实体等价物替换高位字符:

xml_content = unicode_content.encode('ascii', 'xmlcharrefreplace')

那么,完整的方法应该是这样的:

try:
    content = content.decode(parsed_feed.encoding).encode('ascii', 'xmlcharrefreplace')
except UnicodeDecodeError:
    # Couldn't decode the incoming string -- possibly not encoded in utf-8
    # Do something here to report the error

相关问题 更多 >