Консоль Windows, Python и верхний индекс

Я работаю в консоли Windows и не могу напечатать надстрочные цифры. Вот что я получаю:

>>> '¹²³⁴⁵⁶⁷⁸⁹'
'1²345678?'

>>> for i in '¹²³⁴⁵⁶⁷⁸⁹': print(i, i.encode())
...
1 b'1'          # expect  b'\x00\xb9' (U+00B9)
² b'\xc2\xb2'   # expect  b'\x00\xb2' (U+00B2)
3 b'3'          # expect  b'\x00\xb3' (U+00B2)
4 b'4'          # expect  b'\x20\x74' (U+2074)
5 b'5'          # expect  b'\x20\x75' (U+2075)
6 b'6'          # expect  b'\x20\x76' (U+2076)
7 b'7'          # expect  b'\x20\x77' (U+2077)
8 b'8'          # expect  b'\x20\x78' (U+2078)
? b'?'          # expect  b'\x20\x79' (U+2079)

Я попытался установить переменную окружения PYTHONIOENCODING таким образом

set PYTHONIOENCODING=utf-8

но то, что я получаю, это

>>> '¹²³⁴⁵⁶⁷⁸⁹'
   File "<stdin>", line 0

     ^
SyntaxError: 'utf-8' codec can not decode bytes 0xfd in position 2: invalid start byte

проблема в этом случае '²', фактически заменяя его, я получаю

>>> '¹2³⁴⁵⁶⁷⁸⁹'
'12345678?'

Как я могу исправить? Спасибо!

1 ответ

Комментарий Eryksun прав: поддержка консоли для кодовой страницы 65001 (UTF-8) глючит. Тем не менее, есть обходной путь: создать .py скрипт (сохранить в UTF-8):

import unicodedata
x=u'¹²³⁴⁵⁶⁷⁸⁹'
for i in x:
    print( i, 
        unicodedata.normalize('NFKC', i),
        i.encode(),                        # the same as i.encode('utf-8')
        hex(ord(i)),
        ''
        )

Вывод - приведенный выше скрипт используется следующим образом:

D:\bat\SO> set python
PYTHONIOENCODING=UTF-8

D:\bat\SO> chcp
Active code page: 65001

D:\bat\SO> D:\test\Python\Py3\42552164.py

¹ 1 b'\xc2\xb9' 0xb9
² 2 b'\xc2\xb2' 0xb2
³ 3 b'\xc2\xb3' 0xb3
⁴ 4 b'\xe2\x81\xb4' 0x2074
⁵ 5 b'\xe2\x81\xb5' 0x2075
⁶ 6 b'\xe2\x81\xb6' 0x2076
⁷ 7 b'\xe2\x81\xb7' 0x2077
⁸ 8 b'\xe2\x81\xb8' 0x2078
⁹ 9 b'\xe2\x81\xb9' 0x2079

D:\bat\SO>

Среда:

  • Windows 8.1,
  • Python 3.5,
  • cmd шрифт окна Consolas или DejaVu Sans Mono.

Ресурсы: Стандартная библиотека Python.

Обновление с учетом дальнейших комментариев Eryksun. Я не думаю, что обходной путь сценария идеален. Например, вывод из print(x) (добавлено в скрипт выше) будет иметь следующий мусор, выглядящий следующим образом:

¹²³⁴⁵⁶⁷⁸⁹
�⁶⁷⁸⁹
⁸⁹
��

Тем не менее, это, безусловно, лучше, чем полный сбой консоли Python из-за любого ввода, не входящего в ASCII:

D:\bat\SO> py -3
Python 3.5.1 (v3.5.1:37a07cee5969, Dec  6 2015, 01:54:25) [MSC v.1900 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> x=u'¹²³⁴⁵⁶⁷⁸⁹'


D:\bat\SO>
Другие вопросы по тегам