【发布时间】:2015-11-01 02:46:48
【问题描述】:
我对 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 documentation:
'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。那么这背后的原因是什么呢?
【问题讨论】:
标签: python unicode utf-16 surrogate-pairs