Консоль 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>