Должен ли StringIO (HighSurrogate) выдавать ошибку в Python 2.7? - PullRequest
0 голосов
/ 03 апреля 2019

Когда я запускаю этот код Python 2.7 ( редактировать: обновляется код )

import io
x = io.StringIO(u'\ud801')

CPython работает нормально, но IronPython выдает следующую ошибку:

UnicodeEncodeError:
Unable to translate Unicode character \uD801 at index 0 to specified code page.

Я предполагаю, что это потому, что U + D801 является непарным суррогатом и, следовательно, недопустимым символом , но какая реализация отображает здесь правильное поведение? Этот код должен бросить или не бросить?

1 Ответ

0 голосов
/ 04 апреля 2019

Они оба верны, но не делают одно и то же.IronPython, похоже, пытается print символ Unicode и не может преобразовать его в текущую кодовую страницу.Вы получаете то же самое поведение с Python 2.7, если вы печатаете символ:

>>> import io
>>> io.StringIO(u'\ud801').getvalue()
u'\ud801'
>>> print(io.StringIO(u'\ud801').getvalue())
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Python27\lib\encodings\cp437.py", line 12, in encode
    return codecs.charmap_encode(input,errors,encoding_map)
UnicodeEncodeError: 'charmap' codec can't encode character u'\ud801' in position 0: character maps to <undefined>
...