删除解码字符串'surrogateescape'字符的当前习语



Armin Ronacher,http://lucumr.pocoo.org/2013/7/2/the-pocoo.pocoo.org

如果例如将[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]清理代理逃脱的字符串

有关问题跟踪器的当前建议是...利用 现有错误处理程序:

def convert_surrogateescape(data, errors='replace'):
    return data.encode('utf-8', 'surrogateescape').decode('utf-8', errors)

该代码很短,但是语义密集 - 需要一些迭代才能 提出该版本。(添加奖励:一旦您警告了 可能性,为现有Python 3编写自己的版本是微不足道的3 版本。标准名称只是使您更容易查找 用一块代码在它上面,并提供优化的选项 后来,如果似乎值得额外的工作(

功能略有不同。第二个写有关于第一个的知识。

自Python 3.5以来,backslashreplace错误处理程序现在用于解码和编码。第一种方法并非旨在使用backslashreplace,例如解码字节0xFF的错误将被打印为" udcff"。第二种方法旨在解决这个问题。它将打印" xff"。

如果您不需要backslashreplace,则如果您不幸支持Python<3.5(包括Polyglot 2/3代码,哎呀(。

问题

是否有更好的习语是为此目的吗?还是我们仍然使用此插入功能?

nick引用了将此功能添加到codecs模块中的问题。截至2019年起,该功能尚未添加,并且机票仍打开。


最新评论说

MSG314682 Nick Coghlan,2018

最近关于Python-Ideas的讨论还向我介绍了第三方库" FTFY",该图书馆提供了各种各样的工具来清理不适当的解码数据。

包括一个孤独的替代固定器: ftfy.fixes.fix_surrogates(text)

...

我在ftfy中找不到该功能。该文档并不这么说,但它似乎是为了处理surrogateescape和...成为CESU-8的解决方法的一部分,或类似的东西?

用它们代表的字符(正确配对时(或用�否则。

最新更新