less.exe输出错误字符

时间:2019-04-14 04:27:39

标签: python windows character-encoding

以下程序非常简单。它启动一个运行Windows port of the Unix utility less的子进程。

import subprocess
subprocess.run('less.exe', input='Macarrão é uma delícia.', encoding='utf-8')

输入为:

Macarrão é uma delícia.

输出结果如下:

Macarrão é uma delícia.

对此有何解释?我注意到在运行我的python代码之前运行chcp 65001可以解决此问题,但是通过查看related post我不确定这不是解决问题的最佳方法。引用已接受的答案:

  

chcp 65001非常危险。除非程序是专门设计的   解决Windows API中的缺陷(或使用C运行时)   具有这些解决方法的库),则无法可靠地运行。   Win8 fixes ½ of these problems with cp65001, but the rest is still applicable to Win10

我正在Windows 10 64位上运行Python 3.7.0。

2 个答案:

答案 0 :(得分:0)

如eryk所建议的,一种方法是将控制台代码页设置为UTF-8,运行less.exe,然后将代码页设置回以前的版本。

import subprocess
from ctypes import windll

prev_codepage = windll.kernel32.GetConsoleOutputCP()
windll.kernel32.SetConsoleOutputCP(65001)
subprocess.run("less.exe", input='Macarrão é uma delícia', encoding='utf-8')
windll.kernel32.SetConsoleOutputCP(prev_codepage)

答案 1 :(得分:0)

用一个更简单的替代方法来补充your own answer-尽管我不明白为什么为什么;在Windows 10上使用Python 3.8进行了测试:

import os
os.system('echo Macarrão é uma delícia.| less.exe')

在Windows上,os.system()调用cmd.exe(通过环境变量ComSpec),即使以这种方式创建的cmd.exe实例仍将系统的OEM代码页报告为活动代码页,该命令将根据需要运行。