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上运行,但我希望解决方案与平台无关.
结论:注意字符编码(这里有三种不同的字符编码)。如果您想要可移植的 Unicode 支持(将参数作为 Unicode 传递,不对其进行编码),或者确保可以使用环境中的当前字符编码来表示数据(使用sys.getfilesystemencoding()如在第二个中那样在 Python 2 上使用编码)代码示例)。
第一个代码示例不正确。效果和(在IDLE中运行它--)是一样的py -3 -midlelib:
>>> 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\nRun Code Online (Sandbox Code Playgroud)\n\n其中mbcs编解码器使用您的Windows ANSI 代码页(通常:cp1252字符编码 - 它可能不同,例如,cp1251在俄语 Windows 上)。
Python 2 使用CreateProcess宏来启动一个子进程,该子进程相当于CreateProcessA那里的函数。CreateProcessA 将输入字节解释为使用 Windows ANSI 编码进行编码。这是无关的与Python源代码编码(在你的例子中为utf-8)
如果您使用错误的编码,预计您会得到 mojibake。
\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无法使用您的控制台编码来表示。
要支持任意 Unicode 参数(包括无法使用 Windows (“ANSI”) 或 MS-DOS (OEM) 代码页表示的字符),您需要CreateProcessW函数(Python 3 使用的函数)。使用 Python 和 subprocess.Popen()查看Windows 上的 Unicode 文件名。