Armin Ronacher,http://lucumr.pocoo.org/2013/7/2/the-updated-guide-to-unicode/
例如,如果将[os.fsdecode()或等效结果)传递给模板引擎,则您[有时会收到UnicodeEncodeError],并且由于编码发生在更晚的阶段,您不再知道为什么字符串不正确。如果您在发生错误时检测到该错误,则调试起来会容易得多
Armin建议一个功能
def remove_surrogate_escaping(s, method='ignore'):
assert method in ('ignore', 'replace'), 'invalid removal method'
return s.encode('utf-8', method).decode('utf-8')
Nick Coghlan,2014年,[Python-Dev] Cleaning up surrogate escaped strings
关于问题跟踪器的当前建议是...利用 现有的错误处理程序:
def convert_surrogateescape(data, errors='replace'): return data.encode('utf-8', 'surrogateescape').decode('utf-8', errors)
该代码很短,但语义上很密集-花费了一些迭代 拿出那个版本。 (增加的奖励:当您收到提醒时, 可能,为现有的Python 3编写自己的版本很简单 版本。标准名称使您来时更容易查找 跨一段代码,并提供优化它的选项 以后是否值得进行额外的工作)
功能略有不同。第二篇是关于第一篇的知识而写的。
从Python 3.5开始,backslashreplace
错误处理程序现在可用于解码和编码。第一种方法并非设计为使用backslashreplace
,例如解码字节0xff的错误将显示为“ \ udcff”。第二种方法旨在解决此问题。它会显示“ \ xff”。
如果不需要backslashreplace
,如果不幸遇到了支持Python <3.5(包括polyglot 2/3代码,ouch)的情况,则可能更喜欢第一个版本。
有没有更好的成语呢?还是我们仍使用此嵌入式功能?
答案 0 :(得分:0)
Nick在codecs
模块中提到了adding such a function的问题。截至2019年,该功能尚未添加,并且故障单保持打开状态。
最新评论说
msg314682尼克·科格兰,2018年
最近的discussion on python-ideas也向我介绍了第三方库“ ftfy”,该库提供了用于清除不正确解码数据的各种工具。
其中包括一个单独的替代修复程序:
ftfy.fixes.fix_surrogates(text)
...
我在ftfy
中找不到该功能。该文档没有这么说,但似乎旨在处理surrogateescape
和...成为CESU-8或类似方法的解决方法的一部分?
将16位代理代码点替换为它们表示的字符(如果正确配对),否则用�。