Python UnicodeDecodeError-如何从子进程正确读取unicode字符串?

时间:2018-11-13 11:13:10

标签: python unicode subprocess

我在Python的子过程中遇到问题,该子过程返回unicode字符,尤其是德语ü,ä,ö字符。

我的脚本基本上想要打开一个子进程,该子进程使用stdout.read()函数返回一些字符串。这些字符串中的某些可能包含Unicode字符,但是并不总是知道这些字符是否以及在哪里。因此,必须以某种方式对输出进行解码(或编码?)以正确显示字符串。 我无法使用字节对象。

以下代码简要显示了我的操作,但未能解码该字符串,因此“ UnicodeDecodeError:'utf-8'编解码器无法解码位置12的字节0x81:无效的起始字节”错误消息:

import subprocess

command_array = ['echo', 'string_with_ü_ä_ö']
command = subprocess.Popen(command_array, stdout=subprocess.PIPE, shell=True)

command_output = command.stdout.read()
command_output = command_output.decode()
print(command_output)

我觉得必须有一些琐碎的解决方案,但是我找不到任何地方。有什么方法可以正确返回字符串中的那些unicode字符?

我正在使用Python 3.6.3,并且以上脚本在Windows上运行。同样适用于Linux的版本也会受到赞赏!

2 个答案:

答案 0 :(得分:0)

对于Python> = 3.6,您希望subprocess.run()universal_newlines=True

import subprocess

command_array = ['echo', 'string_with_ü_ä_ö']
result = subprocess.run(command_array,
    stdout=subprocess.PIPE, universal_newlines=True)
print(result.stdout)

在Python 3.7中,universal_newlines别名被text取代,从而更好地说明了该选项的实际作用。

答案 1 :(得分:0)

通过反复试验,我发现使用cp850进行解码可以正常工作并产生预期的输出:

import subprocess

command_array = ['echo', 'string_with_ü_ä_ö']
command = subprocess.Popen(command_array, stdout=subprocess.PIPE, shell=True)

command_output = command.stdout.read()
command_output = command_output.decode('cp850')
print(command_output)

如果将以上代码另存为utf8编码文件(无论平台如何,python3的默认文件),然后将其与python3一起运行,则会打印:

string_with_ü_ä_ö

不幸的是,我不知道在何处或为何选择此特定编码,因此这可能不适用于不同的设置,但至少我相信它会与您的设置兼容。