【问题标题】:Python: Run windows CMD commands through python, using å,ä and öPython:通过python运行windows CMD命令,使用å、ä和ö
【发布时间】:2015-01-15 12:27:48
【问题描述】:

我正在尝试通过 python 代码运行命令echo hej värld(瑞典语为“hello world”)。

到目前为止我已经测试过:

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

# -*- coding: utf-8 -*-
import os
os.system("Echo hej värld")

两个版本都返回hej värld

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

【问题讨论】:

  • 适用于 Linux (Python 2.7.3)。两个版本,Echo 更改为 echo。我的猜测是 Windows 的命令行不使用 utf-8 编码。
  • 可能是helpful,或者this
  • 即使我在运行命令之前使用 chcp 65001(即 utf-8)更改了 cmd 编码,我似乎仍然无法打印 å ä ö。现在它返回hej värld
  • 您尝试编码为 windows-1250 还是 windows-1252?
  • @user3012759 运气不好:/

标签: python cmd subprocess


【解决方案1】:

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

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

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

您可以在这里找到更多参考资料:Windows cmd encoding change causes Python crash。特别是,引用的Python bug 在 2014 年 10 月 2 日仍然处于活动状态......

那该怎么办?

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):

eryksun 的评论是对所发生事情的正确解释。 Python 2.7 使用CreateProcessA,这意味着它希望在 Windows 用于其 ANSI 代码页而不是 OEM 代码页的内容中输入命令。因此,对于使用 Windows 1252 作为其 ANSI 代码页的系统,您必须将命令转换为 cp1252

Latin1(或 iso-8859-1)、Latin9(iso-8859-15)和 windows 1252 几乎是相同的字符集……但 符号是它们之间的区别!如果你想在 windows 下使用它,你必须使用 cp1252 变体

【讨论】:

  • 尝试了 1252 和 850,使用 consolas 没有运气:( 是的,我使用的是 2.7。
  • 我无法让它工作:/您在编辑中描述的方法对您有用吗?
  • 我在windows 7法语版下试了一下,效果很好(见上次编辑)
  • 上次编辑成功!你是神!非常感谢 :) CMD 中的字符编码非常棒。编辑:仅供参考,字符页面似乎独立于 pythons 编码。您可以使用任何 chcp,latin1 就是这样做的。
  • Python 2 systemsubprocess.Popen 调用 CreateProcessA,它将命令行解码为 Unicode 为 ANSI 字符串,即编码为 ansi = locale.getpreferredencoding()。由于echo 命令通过调用WriteConsoleW 将unicode 写入控制台,因此输出代码页应该不是问题,除了选择具有正确字形的字体。
猜你喜欢
  • 2011-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-12
  • 2011-11-03
相关资源
最近更新 更多