0

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

我的原始数据超出了我的控制范围,其中一些恰好包含我想要清除的无效字符。

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

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

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

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

但是,是否有任何不错的 python 方法可以在没有这些非字符和其他无效字符的情况下发出“transmitabble”utf8 U+FFFF

4

1 回答 1

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 ﷰ

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

由于保留的代码点可能会在 Unicode 标准的未来版本中被分配,因此去除保留代码点似乎是有风险的。您需要考虑在您的特定情况下以及现在和将来的应用程序中是否有保证。

于 2017-11-16T02:40:12.203 回答