从utf8中删除无效和非字符

时间:2017-11-16 00:51:19

标签: python utf-8

我正在加载一些数据,对其进行处理,然后将数据发送到应用程序(足够公平)不允许无效的utf8 noncharacter s U+FDD0到{{1 }},以及无效的U+FDEFU+FFFE特殊字符。

我的原始数据不受我的控制,而有些数据恰好包含我要清理的无效字符。

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

例如 U+FFFF返回b'\xef\xbf\xbf'.decode('utf-8', 'ignore')而不是忽略无效字符,'\uffff'具有相同的行为。

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

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

然而,是否有任何不错的python方式发出' transmitabble' utf8没有这些非字符和其他无效字符,如encode

1 个答案:

答案 0 :(得分:0)

我没有充分考虑到这种情况的后果,但是,您可以删除那些具有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 ﷰ

有关于字符类别herehere的一些信息 - 向下滚动到“受限制的交换”。

看起来剥离保留代码点会有风险,因为它们可能会在Unicode标准的未来版本中被分配。您需要考虑在特定情况下是否有必要以及现在和将来的应用程序。