Premailer - UnicodeEncodeError:'ascii'编解码器无法对字符u'\ u2013'进行编码

时间:2016-01-08 15:55:44

标签: python character-encoding premailer

我正在尝试使用premailer将我创建的html文档转换为可以使用内联css样式发送电子邮件的内容。但是,当我尝试进行转换时,我收到以下错误:

Traceback (most recent call last):
 File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/runpy.py", line 162, in _run_module_as_main
"__main__", fname, loader, pkg_name)
 File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/runpy.py", line 72, in _run_code
exec code in run_globals
File "/Users/oldo/Python/virtual-environments/AMS-Journal/lib/python2.7/site-packages/premailer/__main__.py", line 142, in <module>
sys.exit(main(sys.argv[1:]))
File "/Users/oldo/Python/virtual-environments/AMS-Journal/lib/python2.7/site-packages/premailer/__main__.py", line 137, in main
options.outfile.write(p.transform(pretty_print=options.pretty))
UnicodeEncodeError: 'ascii' codec can't encode character u'\u2013' in position 106688: ordinal not in range(128)

我已经看到人们提出类似问题的问题过多,但我似乎无法在纠正错误方面取得任何进展。

我的文件是用utf-8编码的,所以我很困惑为什么我会收到这个错误。

有人会对我可以尝试向前推进的事情提出任何建议吗?

2 个答案:

答案 0 :(得分:0)

经过很多人的努力,我终于能够解决问题的根源。显然,我需要更多地了解文本编码之间的差异以及如何在Python中处理它们。

我正在处理预编程的输入文件已在utf-8中编码,程序似乎需要ascii。我正在使用与mongodb链接的jinja2创建输入文件,我强制将文件写入ascii并忽略错误。

import io

# stuff setting up jinja ready to render the template...

renderedTemplate = template.render(context)

email = io.open('email.html', 'w', encoding='ascii', errors="ignore")
email.write(renderedTemplate)
email.close()

我意识到这不是一个理想的解决方案,因为utf-8无法识别的ascii字符只会被丢弃,所以可能会有一些看起来很滑稽的字眼,但希望这会不是太大的问题。我很高兴再次与我的项目一起前进!

答案 1 :(得分:0)

有同样的问题,但html源需要utf_8编码。

通过PYTHONIOENCODING在显式编码格式前加上预编译命令,解决了我的问题:

PYTHONIOENCODING=utf_8 python -m premailer -f reports.html --external-style ./style/jbehave-core.css > emailable-reports.html

在你的情况下可能是另一种方式:

PYTHONIOENCODING=ascii python -m premailer -f report.html --external-style ./style/somestyle.css > emailable-report.html

有关在python中设置/更改默认编码的更多信息: Changing default encoding of Python?