Python子进程回显一个unicode文字

Sha*_*non 7 python unicode subprocess unicode-literals

我知道之前已经问过这样的问题了.但我找不到解决方案.

我想在子程序模块中使用我的python文件中定义的unicode文字.但我没有得到我需要的结果.例如以下代码

# -*- coding: utf-8 -*-
import sys
import codecs
import subprocess
cmd = ['echo', u'??']
new_cmd = []
for c in cmd:
    if isinstance(c,unicode):
        c = c.encode('utf-8')
    new_cmd.append(c)
subprocess.call(new_cmd)
Run Code Online (Sandbox Code Playgroud)

打印出来

你好
Run Code Online (Sandbox Code Playgroud)

如果我将代码更改为

# -*- coding: utf-8 -*-
import sys
import codecs
import subprocess
cmd = ['echo', u'??']
new_cmd = []
for c in cmd:
    if isinstance(c,unicode):
        c = c.encode(sys.getfilesystemencoding())
    new_cmd.append(c)
subprocess.call(new_cmd)
Run Code Online (Sandbox Code Playgroud)

我得到以下内容

??
Run Code Online (Sandbox Code Playgroud)

在这个阶段,我只能假设我反复犯了一个简单的错误.但我很难弄清楚它是什么.当通过python的子进程调用时,如何获得echo以打印出以下内容

??
Run Code Online (Sandbox Code Playgroud)

编辑:

Python的版本是2.7.我在Windows 8上运行,但我希望解决方案与平台无关.

jfs*_*jfs 1

结论:注意字符编码(这里有三种不同的字符编码)。如果您想要可移植的 Unicode 支持(将参数作为 Unicode 传递,不对其进行编码),或者确保可以使用环境中的当前字符编码来表示数据(使用sys.getfilesystemencoding()如在第二个中那样在 Python 2 上使用编码)代码示例)。

\n\n
\n\n

第一个代码示例不正确。效果和(在IDLE中运行它--)是一样的py -3 -midlelib

\n\n
>>> print(u\'\xe4\xbd\xa0\xe5\xa5\xbd\'.encode(\'utf-8\').decode(\'mbcs\')) #XXX DON\'T DO IT!\n\xc3\xa4\xc2\xbd\xc2\xa0\xc3\xa5\xc2\xa5\xc2\xbd\n
Run Code Online (Sandbox Code Playgroud)\n\n

其中mbcs编解码器使用您的Windows ANSI 代码页(通常:cp1252字符编码 - 它可能不同,例如,cp1251在俄语 Windows 上)。

\n\n

Python 2 使用CreateProcess宏来启动一个子进程,该子进程相当于CreateProcessA那里的函数。CreateProcessA 将输入字节解释为使用 Windows ANSI 编码进行编码。这是无关的与Python源代码编码(在你的例子中为utf-8)

\n\n

如果您使用错误的编码,预计您会得到 mojibake。

\n\n
\n\n

如果输入字符可以使用 Windows 代码页表示(例如cp1252(以启用从 Unicode 到字节的编码)),并且如果echo使用 Unicode API 打印到 Windows 控制台WriteConsoleW()(例如,请参阅 Python 3 包- 它可以启用您的任何内容),那么您的第二个代码示例win-unicode-console应该可以工作chcp(“OEM”)只要控制台中的字体支持这些字符即可)或者可以使用 OEM 代码页(由)表示字符,例如(运行以找出您的代码页)。问号表明print(u\'\xe4\xbd\xa0\xe5\xa5\xbd\') cmd.execp437chcp??\xe4\xbd\xa0\xe5\xa5\xbd无法使用您的控制台编码来表示。

\n\n

要支持任意 Unicode 参数(包括无法使用 Windows (“ANSI”) 或 MS-DOS (OEM) 代码页表示的字符),您需要CreateProcessW函数(Python 3 使用的函数)。使用 Python 和 subprocess.Popen()查看Windows 上的 Unicode 文件名

\n