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'
) を生成するだけです。では、代わりに例外が発生するのはなぜですか?
これはおそらく私の2番目の質問に関連しています:
バージョン 3.4 で変更: utf-16* および utf-32* エンコーダーは、サロゲート コード ポイント (U+D800–U+DFFF) のエンコードを許可しなくなりました。
( https://docs.python.org/3/library/codecs.html#standard-encodingsより)
私の知る限り、いくつかのコード ポイントをサロゲート ペアなしで UTF-16 にエンコードすることは不可能です。では、この背後にある理由は何ですか?