Windows控制台,python和上标数字

时间:2017-03-02 09:57:33

标签: python windows unicode superscript

我在Windows控制台工作,无法打印superscript digits。 这就是我得到的:

>>> '¹²³⁴⁵⁶⁷⁸⁹'
'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 个答案:

答案 0 :(得分:2)

Eryksun's comment是对的:控制台对代码页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

资源:The Python Standard Library

鉴于Eryksun的进一步评论,

更新。我不认为脚本解决方法是完美的。例如,print(x)的输出(添加到上面的脚本中)会有一些跟踪垃圾,如下所示:

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

尽管如此,由于任何非ASCII输入,它肯定胜过完全崩溃的Python控制台

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>