windows控制台、python和上标数字

windows控制台、python和上标数字,python,windows,unicode,superscript,Python,Windows,Unicode,Superscript,我在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

我在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)
我试图以这种方式设置环境变量pythoniocodeding

set PYTHONIOENCODING=utf-8
但我得到的是这个

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

     ^
SyntaxError: 'utf-8' codec can not decode bytes 0xfd in position 2: invalid start byte
我该怎么修理?
谢谢

是正确的:控制台对代码页65001(UTF-8)的支持有缺陷。但是,有一个解决方法:创建
.py
脚本(保存在UTF-8中):

输出-上述脚本使用如下:

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
    窗口字体控制台或DejaVu Sans Mono
资源:

更新,以了解埃里克森的进一步评论。我认为脚本解决方案并不完美。例如,
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>

我认为有些事情windows控制台根本做不到。。你可以在谷歌上搜索chcp,并从中获取它。控制台对代码页65001(UTF-8)的支持存在缺陷(例如,即使在Windows 10的WSL Linux子系统中,它也不支持非ASCII输入),因此使用UTF-8并不是答案。解决方案是使用宽字符函数
ReadConsoleW
WriteConsoleW
将UTF-16读写到控制台。Python 3.6有一个新的Windows控制台I/O实现,可以实现这一点,对于较旧的版本,您可以安装.@Ev.Kounis,Windows控制台(conhost.exe)可以潜在地显示Unicode基本多语言平面(BMP)中的所有字符。至少保留了代理项对。控制台的默认字体支持是有限的,因为它似乎不使用Uniscribe。但是,您可以在注册表项
HKLM\softwaremmicrosoft\windowsnt\CurrentVersion\FontLink\SystemLink
中手动定义回退链接。例如,如果使用此字体,请创建一个名为“Consolas”的新多字符串值。从现有值复制链接,例如
MINGLIU.TTC、PMingLiU
SIMSUN.TTC、SIMSUN
。可能重复使用Python 3.6。很好。Python 3.6使用Windows Unicode API并在命令提示符中修复了许多Unicode问题。请尝试在Windows 7中使用代码页65001。输出将有尾随垃圾,因为
WriteFile
错误地返回解码的UTF-16码点数,而不是写入的字节数。错误在控制台本身(即conhost.exe;而不是cmd.exe shell)中。当Microsoft完全重写与控制台的IPC通信以使用ConDrv设备驱动程序的真正内核句柄时,此错误在Windows 8中得到修复。即使在最新的Windows 10中,您也无法使用代码页65001读取非ASCII(代码1-127除外)。这是conhost.exe中一个更基本的错误,需要重写以不再假设输入代码页是SBCS或DBCS。UTF-8的大小从1-4字节不等,当控制台调用
WideCharToMultiByte
将其UTF-16输入缓冲区编码为UTF-8时,需要更智能的缓冲区分配。如果输入缓冲区甚至有1个非ASCII字符,编码就会失败,这会导致
ReadFile
返回成功读取的0个字节,这意味着文件结束(EOF)。您在尝试输入
时在3.5中看到了这一点⁴⁵⁶⁷⁸⁹'并不是真正的崩溃。3.5中的REPL使用标准I/O实现从控制台进行读取。这将调用CRT的
read
函数,该函数在二进制模式下调用
ReadFile
。因为您使用的是控制台的代码页65001的错误实现,所以此调用“成功”读取0字节,REPL合法地将其解释为EOF并正常退出。它不会崩溃。在3.6+中,这一切都可以使用Windows范围的字符API正常工作。3.6之前版本的解决方案是安装并启用
win\u unicode\u控制台
¹²³⁴⁵⁶⁷⁸⁹
�⁶⁷⁸⁹
⁸⁹
��
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>