m4t*_*4tx 1 python unicode utf-16 surrogate-pairs
我在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
Run Code Online (Sandbox Code Playgroud)
如果我没记错的话,根据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。那么,这背后的原因是什么呢?
进行此更改是因为Unicode标准明确禁止此类编码。请参阅问题#12892,但是显然这些surrogateescape错误处理程序无法与UTF-16或UTF-32配合使用,因为这些编解码器与ASCII不兼容。
特别:
我测试了utf_16_32_surrogates_4.patch:带编码器的surrogateescape无法正常工作。
Run Code Online (Sandbox Code Playgroud)>>> b'[\x00\x80\xdc]\x00'.decode('utf-16-le', 'ignore') '[]' >>> b'[\x00\x80\xdc]\x00'.decode('utf-16-le', 'replace') '[?]' >>> b'[\x00\x80\xdc]\x00'.decode('utf-16-le', 'surrogateescape') '[\udc80\udcdc\uffff'=>我期望
'[\udc80\udcdc]'。
对此的回应:
是的,surrogateescape不适用于ASCII不兼容的编码,并且不能。首先,它不能代表
b'\x00\xd8'从utf-16-le或b'ABCD'utf-32 * 解码的结果。这个问题值得在Python-Dev上分开讨论(甚至是PEP)并进行讨论。
我相信surrogateescape处理程序更适合于UTF-8数据;现在,对UTF-16或UTF-32的解码也可以使用,但显然不能在另一个方向上使用。
| 归档时间: |
|
| 查看次数: |
4725 次 |
| 最近记录: |