从utf8中删除无效和非字符

2024-10-03 17:27:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在加载一些数据,对其进行处理,然后将数据发送到一个应用程序,该应用程序(足够公平)不允许使用无效的utf8noncharactersU+FDD0U+FDEF,以及无效的U+FFFEU+FFFF特殊字符。你知道吗

我的原始数据超出了我的控制范围,有些数据恰好包含我要清除的无效字符。你知道吗

但是,我的python代码仍然向应用程序发送无效的utf8,因为它不会忽略非字符和其他无效字符。你知道吗

例如 b'\xef\xbf\xbf'.decode('utf-8', 'ignore')返回'\uffff'而不是忽略无效字符,并且encode具有相同的行为。你知道吗

我首先用U+FFFE调试了它,它有一个与BOM相关的wontfix bug。https://bugs.python.org/issue765036

然后我发现了一个巨大的电子邮件列表线程(https://bugs.python.org/issue12729),它声称可以发出非字符,因为应用程序可能希望保留它们以供内部使用。你知道吗

但是,有没有什么好的python方法可以在没有这些非字符和其他无效字符(如U+FFFF)的情况下发出“transmitable”utf8呢?你知道吗


Tags: 数据httpsorg应用程序公平utf8字符bugs
1条回答
网友
1楼 · 发布于 2024-10-03 17:27:02

我还没有充分考虑到这一点的后果,但是,您可以去掉那些unicode类别为“非字符”的字符:

>>> s = '\uffff\ufffeSome string that contains \ufdd0, \ufdd1, \ufdef and \ufdf0'
>>> print(s)
Some string that contains ﷐, ﷑, ﷯ and ﷰ

>>> s = ''.join(c for c in s if unicodedata.category(c) != 'Cn')
>>> print(s)
Some string that contains , ,  and ﷰ

有一些关于字符类别的信息here,和here-向下滚动到“受限交换”。你知道吗

似乎去掉保留的代码点是有风险的,因为它们有可能在未来版本的Unicode标准中被分配。你需要考虑它是否在你的特殊情况下以及你现在和将来的申请中得到保证。你知道吗

相关问题 更多 >