Python 字符串中的转义十六进制字符

Python 字符串中的转义十六进制字符,python,unicode,encoding,Python,Unicode,Encoding,我在Windows上用Python执行了一个函数,该函数返回以下字符串: p = subprocess(args=["devenv.exe", "project.sln"], ...) stdout, stderr = p.communicate() print(stdout) # b'unzul\x84ssig' 这应该叫做unzulässig。我想知道我需要使用哪个解码器将其转换回单词。string\u escape或utf8当然不起作用。有人能帮我吗?看起来您可能需要: 所以 正如@de

我在Windows上用Python执行了一个函数,该函数返回以下字符串:

p = subprocess(args=["devenv.exe", "project.sln"], ...)
stdout, stderr = p.communicate()
print(stdout) # b'unzul\x84ssig'
这应该叫做unzulässig。我想知道我需要使用哪个解码器将其转换回单词。string\u escape或utf8当然不起作用。有人能帮我吗?

看起来您可能需要:

所以

正如@deceze在评论中指出的,IBM437和IBM850也是可能的

>>> res.decode('ibm437')
'unzulässig'
>>> res.decode('ibm850')
'unzulässig'
不同的字符集之间有很多重叠,但基于这个小样本,我们所能做的就是建议那些已知的将“ä”映射到b'\x84'的字符集。例如,我最初对858的建议是注意到858是一个带有欧式符号的西欧语言的DOS代码页。即使忽略0-127,许多单字节编码对于大多数代码点可能都是相同的,它们通常共享相同的ASCII根,但在选择值时可能不同。

res=function.decodecp852 printres b'unzul\x84ssig' 你怎么知道是cp852?您必须从函数的文档中了解这一点,或者从函数的数据源中了解这一点。如果你得到一个字节的输入,就没有“文本”这类东西——你必须知道用哪个编码来表示那些字节所需的文本

我建议阅读


特别是在WIndows下,cmd窗口确实使用旧的DOS编码,以便与1980年代的代码兼容-从cmd shell启动的Python解释器可能会在sys.stdout.encoding属性中反映此编码

转换为实际字符串,不是字节,但我需要它的编码,如果我不得不猜测的话,我会说它类似于扩展ASCII,不幸的是,它实际上并不意味着什么。如果你告诉我们你是怎么得到这个字符串的,那会有帮助的。b'unzul\xc3\xa4ssig'。解码'utf-8'='unzulässig'IBM437和IBM850是…天哪!非常感谢!5分钟内还不能接受答案这是多种可能性中的一种。它可能会在不同的字符上失败…是的,最好从源代码了解编码。另外,cp852可能是candidate@DanielStephens如果您在代码页中使用“mbcs”,Python将选择您的Windows版本使用的代码页。谢谢!我更新了我的问题,从哪里得到了yes的字符串-sys.stdout.encoding仍然是一个很好的地方,可以尝试从中获得正确的编码。另外,您可以尝试在Popen调用中使用shell=False,但这只会将编码更改为另一种编码,可能是sys.getdefaultencoding返回的编码,谢谢您的提示。sys.stdout.encoding和sys.getdefaultencoding不幸指向utf-8
>>> res = b'unzul\x84ssig'
>>> res.decode('858')
'unzulässig'
>>> res.decode('ibm437')
'unzulässig'
>>> res.decode('ibm850')
'unzulässig'