我正在加载一些数据,对其进行处理,然后将数据发送到应用程序(足够公平)不允许无效的utf8 noncharacter
s U+FDD0
到{{1 }},以及无效的U+FDEF
和U+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
?
答案 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 ﷰ
有关于字符类别here和here的一些信息 - 向下滚动到“受限制的交换”。
看起来剥离保留代码点会有风险,因为它们可能会在Unicode标准的未来版本中被分配。您需要考虑在特定情况下是否有必要以及现在和将来的应用程序。