当前习惯于从解码字符串中删除“ surrogateescape”字符

时间:2019-04-30 13:41:27

标签: python python-3.x unicode python-unicode

  

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)的情况,则可能更喜欢第一个版本。

问题

有没有更好的成语呢?还是我们仍使用此嵌入式功能?

1 个答案:

答案 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位代理代码点替换为它们表示的字符(如果正确配对),否则用�。