从解码字符串中删除'surrogateescape'字符的当前习惯用法

问题描述 投票:1回答:1

Armin Ronacher,http://lucumr.pocoo.org/2013/7/2/the-updated-guide-to-unicode/

例如,如果您将[os.fsdecode()或等效的结果]传递给模板引擎,您[有时会在其他地方获得UnicodeEncodeError]并且因为编码发生在更晚的阶段,您不再知道字符串不正确的原因。如果在发生错误时检测到该错误,则问题变得更容易调试

阿明提出了一个功能

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(包括多语言2/3代码,ouch),您可能更喜欢第一个版本。

为此目的还有更好的成语吗?或者我们仍然使用这种插入功能?

python python-3.x unicode python-unicode
1个回答
0
投票

尼克提到了adding such a functioncodecs模块的问题。自2019年起,该功能尚未添加,并且票证仍然打开。


最新评论说

msg314682 Nick Coghlan,2018年

最近的discussion on python-ideas还向我介绍了第三方库“ftfy”,它提供了各种清理不正确解码数据的工具。

这包括一个单独的代理修复器:ftfy.fixes.fix_surrogates(text)

...

我没有发现ftfy中的功能很吸引人。文档没有这么说,但它似乎旨在处理surrogateescape和...是CESU-8的解决方法的一部分,或类似的东西?

将16位代理代码点替换为它们代表的字符(正确配对时),或者用 代替。

© www.soinside.com 2019 - 2024. All rights reserved.