Как сделать суррогатный экран в python2

Python3 изменил поведение Unicode, чтобы запретить суррогатные пары, а python2 — нет.

Здесь есть вопрос

Но он не дает решения о том, как удалить суррогатные пары в python2 или как сделать суррогатный побег.

Пример Python3:

>>> a = b'\xed\xa0\xbd\xe4\xbd\xa0\xe5\xa5\xbd'
>>> a.decode('utf-8', 'surrogateescape')
'\udced\udca0\udcbd你好'
>>> a.decode('utf-8', 'ignore')
'你好'

«\xed\xa0\xbd» здесь не является правильными символами utf-8. И я хочу игнорировать их или убежать от них.

Можно ли сделать то же самое в python2?


person lxyu    schedule 29.10.2013    source источник
comment
Что именно вы хотите сделать? Это не понятно. Приведите пример.   -  person Mark Tolonen    schedule 29.10.2013
comment
@MarkTolonen Я добавил пример.   -  person lxyu    schedule 29.10.2013
comment
Я не вижу лучшего способа, чем постобработка декодированного объекта Unicode для удаления всех символов между «\ udc00» и «\ udfff».   -  person Armin Rigo    schedule 29.10.2013
comment
@ArminRigo, у вас есть ссылка на «\ udc00» и «\ udfff»? Почему они граница?   -  person lxyu    schedule 31.10.2013
comment
Они являются высшими суррогатами. Смотрите где угодно, например. в Википедии. Я могу только присоединиться к Марку: непонятно, что вы хотите сделать. Вы хотите, чтобы эквивалентный код делал то же самое, что и декодирование Python 3 ('utf-8', 'surrogateescape') и декодирование ('utf-8', 'ignore'), но в Python 2?   -  person Armin Rigo    schedule 01.11.2013
comment
@ArminRigo да, это так.   -  person lxyu    schedule 04.11.2013
comment
Боюсь, встроенного решения нет. Вам нужно написать функцию, которая просматривает каждый символ (скажем, полученный юникод), ищет, какие из них являются суррогатными, и заменяет их по мере необходимости, чтобы эмулировать нужное вам поведение.   -  person Armin Rigo    schedule 04.11.2013
comment
@lxyu ты нашел ответ, как это сделать?   -  person underrun    schedule 21.04.2014


Ответы (1)


Встроенного решения нет, но есть реализация суррогатных экранов в python-future: https://github.com/PythonCharmers/python-future

Добавьте from future.utils.surrogateescape import register_surrogateescape к импорту. Затем вызовите метод register_surrogateescape(), после чего вы сможете использовать обработчик ошибок errors='surrogateescape' в encode и decode.

Пример можно найти здесь

person proski    schedule 04.02.2015