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

时间:2019-11-13 15:28:42

标签: python unicode encoding

我在Windows上的Python中执行了一个返回此字符串的函数:

p = subprocess(args=["devenv.exe", "project.sln"], ...)
stdout, stderr = p.communicate()
print(stdout) # b'unzul\x84ssig'

这应该称为unzulässig。我想知道我需要使用哪个解码器将其转换回单词。 string_escapeutf8(当然不是)都可以正常工作。谁能帮我吗?

2 个答案:

答案 0 :(得分:4)

您可能想要code page 858

>>> "unzulässig".encode('858')
b'unzul\x84ssig'

所以

>>> res = b'unzul\x84ssig'
>>> res.decode('858')
'unzulässig'

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

>>> res.decode('ibm437')
'unzulässig'
>>> res.decode('ibm850')
'unzulässig'

各种字符集之间有很多重叠,但是基于这个小样本,我们所能做的就是建议将已知的'ä'映射到b'\x84'的字符集。例如,我最初对858的建议是在https://en.wikipedia.org/wiki/Windows_code_page注意到858是用于西欧语言(带有欧元符号)的DOS代码页。 很多单字节编码对于大多数代码点可能是相同的(甚至忽略0-127,它们通常共享相同的ASCII根),但是在选择值上可能有所不同。

答案 1 :(得分:3)

res = function().decode("cp852")
print(res) # b'unzul\x84ssig'

您怎么知道它是cp852?您必须从function的文档或它的数据源知道这一点。如果要输入字节,则没有“文本”之类的东西-您必须知道使用哪种编码将所需文本表示为这些字节。

我建议阅读https://www.joelonsoftware.com/2003/10/08/the-absolute-minimum-every-software-developer-absolutely-positively-must-know-about-unicode-and-character-sets-no-excuses/

(特别是在Windows下,cmd窗口确实使用了旧的DOS编码,以便与1980年代的代码兼容-从CMD shell启动的Python解释器可能会在{{1} }属性)