从 utf8 中去除无效和非字符
Strip invalid and noncharacters from utf8
我正在加载一些数据,对其进行处理,然后将数据发送到(足够公平)不允许无效 utf8 noncharacter
s U+FDD0
到 U+FDEF
的应用程序,以及无效的 U+FFFE
和 U+FFFF
特殊字符。
我的原始数据不受我的控制,有些数据恰好包含我想要清理的无效字符。
但是,我的 python 代码仍在向应用程序发送无效的 utf8,因为它不会忽略非字符和其他无效字符。
例如
b'\xef\xbf\xbf'.decode('utf-8', 'ignore')
returns '\uffff'
而不是忽略无效字符,并且 encode
具有相同的行为。
我首先用U+FFFE调试了这个,它有一个与BOM相关的wontfix bug。 https://bugs.python.org/issue765036
然后我发现这个庞大的电子邮件列表线程 (https://bugs.python.org/issue12729) 声称可以发出非字符,因为应用程序可能希望保留它们供内部使用。
但是,有没有什么好的 python 方法来发出 'transmitabble' utf8 而没有这些非字符和其他无效字符,如 U+FFFF
?
我还没有完全考虑这方面的后果,但是,您可以去掉那些 unicode 类别为 "non-character":
的字符
>>> 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, and here - 向下滚动到 "Restricted Interchange"。
由于保留代码点可能会在 Unicode 标准的未来版本中分配,因此删除保留代码点似乎是有风险的。您需要考虑在您的特定情况下以及现在和将来的应用程序中是否有必要。
我正在加载一些数据,对其进行处理,然后将数据发送到(足够公平)不允许无效 utf8 noncharacter
s U+FDD0
到 U+FDEF
的应用程序,以及无效的 U+FFFE
和 U+FFFF
特殊字符。
我的原始数据不受我的控制,有些数据恰好包含我想要清理的无效字符。
但是,我的 python 代码仍在向应用程序发送无效的 utf8,因为它不会忽略非字符和其他无效字符。
例如
b'\xef\xbf\xbf'.decode('utf-8', 'ignore')
returns '\uffff'
而不是忽略无效字符,并且 encode
具有相同的行为。
我首先用U+FFFE调试了这个,它有一个与BOM相关的wontfix bug。 https://bugs.python.org/issue765036
然后我发现这个庞大的电子邮件列表线程 (https://bugs.python.org/issue12729) 声称可以发出非字符,因为应用程序可能希望保留它们供内部使用。
但是,有没有什么好的 python 方法来发出 'transmitabble' utf8 而没有这些非字符和其他无效字符,如 U+FFFF
?
我还没有完全考虑这方面的后果,但是,您可以去掉那些 unicode 类别为 "non-character":
的字符>>> 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, and here - 向下滚动到 "Restricted Interchange"。
由于保留代码点可能会在 Unicode 标准的未来版本中分配,因此删除保留代码点似乎是有风险的。您需要考虑在您的特定情况下以及现在和将来的应用程序中是否有必要。