Python:通过Python运行windows CMD命令,使用åä;和ö;

Python:通过Python运行windows CMD命令,使用åä;和ö;,python,cmd,subprocess,Python,Cmd,Subprocess,我试图通过python代码运行命令echo hej värld(瑞典语表示“hello world”) 到目前为止,我已经测试了: # -*- coding: utf-8 -*- import subprocess print subprocess.check_output("Echo hej värld", shell = True) 及 两个版本都返回hej vÃrld 如果我只是在CMD提示符中键入命令,它将返回正确的版本,使用ä。我可以在windows 7系统上进行一些测试。问题不在于

我试图通过python代码运行命令echo hej värld(瑞典语表示“hello world”)

到目前为止,我已经测试了:

# -*- coding: utf-8 -*-
import subprocess
print subprocess.check_output("Echo hej värld", shell = True)

两个版本都返回
hej vÃrld


如果我只是在CMD提示符中键入命令,它将返回正确的版本,使用ä。

我可以在windows 7系统上进行一些测试。问题不在于命令的执行,而在于UTF-8字符的显示

首先,它使用Python3.4几乎可以正常工作:它可以毫无问题地显示ä。所以我假设您使用的是2.x版本

在2.x版本中,几乎不可能正确显示UTF8字符串。如果您能正确执行,驱动程序会抱怨,因为字符数与字节数不同

您可以在此处找到更多参考:。特别是,2014-10-02年的参考数据仍然有效

那怎么办呢

Windows中唯一正确的解决方案是使用8位唯一字符集。如果您使用
Consolas
字体,Latin1(windows cp 1252)应显示瑞典语字符
CP850
通常是OEM光栅字符集(在西欧),并且工作正常

编辑:具体操作指南

  • 对于Python 2.7:

    #first define a unicode string in a portable way
    utxt = u"Echo hej v\u00e4rld"
    #convert it in ANSI (whatever the current console cp can be)
    txt = utxt.encode('cp1252')
    
    os.system('echo ' + txt)
    
  • 对于Python 3.x:

    #first define a unicode string in a portable way
    utxt = u"Echo hej v\u00e4rld"
    
    os.system('echo ' + txt)
    
当然,如果您有
#-*-coding:utf-8-*-
行,您可以安全地编写
värld
而不是
v\u00e4rld

编辑(4):

埃里克森的评论是对所发生事情的恰当解释。Python2.7使用
CreateProcessA
,这意味着它希望在Windows用于ANSI代码页而不是OEM代码页的内容中输入命令。因此,对于使用Windows 1252作为ANSI代码页的系统,必须将命令转换为
cp1252


Latin1(或iso-8859-1)、Latin9(iso-8859-15)和windows 1252几乎是相同的字符集。。。但是,
符号是它们之间的区别!如果您想在windows下使用它,则必须使用在Linux(Python 2.7.3)上运行的
cp1252
variant

。两个版本,将
Echo
更改为
Echo
。我的猜测是Windows的命令行没有使用utf-8编码。可能,或者。即使我在运行命令之前使用
chcp 65001
(即utf-8)更改cmd编码,我仍然无法打印åäö。现在它返回
hej vÃrld
。您是否尝试编码到windows-1250或windows-1252?@user301259 No luck:/consolas No luck:(是的,我使用的是2.7。我无法让它工作:/您在编辑中描述的方法对您有用吗?我在windows 7法语版本下尝试过,它工作了(见上次编辑)上次编辑成功了!你是上帝!非常感谢:)CMD中的字符编码非常棒。编辑:仅供参考,字符页似乎独立于Python编码。您可以使用任何chcp,拉丁1就是它的功用。Python 2
system
subprocess.Popen
调用
CreateProcessA
,它将命令行解码为Unicode作为ANSI字符串,即使用编码e> ansi=locale.getPreferredEncode()。由于
echo
命令通过调用
WriteConsoleW
将unicode写入控制台,因此输出代码页不应成为问题,除非用于选择具有正确字形的字体。
#first define a unicode string in a portable way
utxt = u"Echo hej v\u00e4rld"

os.system('echo ' + txt)