我对 Python (3.4) 中的 Unicode 代理编码有疑问:
>>> b'\xCC'.decode('utf-16_be', 'surrogateescape').encode('utf-16_be', 'surrogateescape')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'utf-16-be' codec can't encode character '\udccc' in position 0: surrogates not allowed
如果我没记错的话,根据Python 文档:
'surrogateescape':解码时,将字节替换为从 U+DC80 到 U+DCFF 的各个代理代码。当编码数据时使用“surrogateescape”错误处理程序时,此代码将被转换回相同的字节。
代码应该只生成源序列 ( b'\xCC'
)。那么为什么会引发异常呢?
这可能与我的第二个问题有关:
在 3.4 版中更改:utf-16* 和 utf-32* 编码器不再允许对代理代码点 (U+D800–U+DFFF) 进行编码。
(来自https://docs.python.org/3/library/codecs.html#standard-encodings)
据我所知,如果没有代理对,就不可能将某些代码点编码为 UTF-16。那么这背后的原因是什么?