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



我在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下也能工作的版本将同样受到赞赏!

经过反复试验,我发现用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_ü_ä_ö

不幸的是,我不知道在哪里或为什么选择这种特定的编码,所以这可能不适用于不同的设置,但至少我相信它会适用于您的设置。

使用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替换,这更好地解释了该选项的实际作用。

最新更新