首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >cp1252标号的译码

cp1252标号的译码
EN

Stack Overflow用户
提问于 2019-12-05 14:25:37
回答 1查看 350关注 0票数 1

我想列出在本地Windows机器上运行的服务。为此,我使用了以下代码:

代码语言:javascript
复制
with Popen(["net", "start"], stdout=PIPE, stderr=PIPE) as p:
    stdout, stderr = p.communicate()  # type: (bytes, bytes)

输出的一部分如下(德文Windows版本):

代码语言:javascript
复制
Folgende Windows-Dienste sind gestartet:

   Anmeldedienst
   [...]
   Benachrichtigungsdienst für Systemereignisse

将字节解码为字符串应该很容易。我检查了文档并在命令行中找到了本地编码:

代码语言:javascript
复制
>>> import locale
>>> locale.getpreferredencoding()
'cp1252'

因此,我想解码字节:

代码语言:javascript
复制
lines = stdout.decode('cp1252')

但是,对于示例中列出的umlaut ü,我得到了一条错误消息:

代码语言:javascript
复制
File "test.py", line 511, in my_func
    lines = stdout.decode('cp1252')
File "C:\Python344\lib\encodings\cp1252.py", line 15, in decode
    return codecs.charmap_decode(input,errors,decoding_table)
UnicodeDecodeError: 'charmap' codec can't decode byte 0x81 in position 152: character maps to <undefined>

但是,我知道UTF-8 contains a representation of the ü character

代码语言:javascript
复制
U+00FC  ü   c3 bc   LATIN SMALL LETTER U WITH DIAERESIS

我不明白为什么这个翻译不能完成。

备注:

我知道,在使用

  • 进行Popen调用时,我可以避开所有的考验,但使用它可以让我分析编码的问题所在。从Python3.5开始,
  • 似乎添加了一个encoding=选项,也许这样可以防止出现这样的问题。遗憾的是,Python3.4是某些Linux版本中包含的版本。

编辑1:这里正在发生一些事情。虽然Python3.4文档声明默认编码是cp1252,但是当在CLI上运行命令并重定向到文件时,文件是用IBM850编码的。最好的猜测是,locale.getpreferredencoding()不返回CLI的编码。

编辑2:使用ibm850对stdout进行解码就像一种魅力。这意味着使用universal_newlines=True进行Popen调用确实使用了locale.getpreferredencoding()返回的编码,但这是解码Popen输出的错误编码。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-12-05 14:54:39

解决办法是:

当使用带有Popenuniversal_newslines=True调用时,强制对返回的stdout、stderr数据进行字符串解释。但是,解释是使用locale.getpreferredencoding()返回的编码完成的,在本例中是cp1252。但是,命令行上的数据不是使用cp1252 (类似Windows风格的编码)编码的,而是使用ibm850 (DOS编码)编码的。因为解码在字节和int上运行,而且由于ü (0x81)的stdout中的int在cp1252解码表中没有对应的值,所以抛出了一个来自cp1252深度的异常。

使用str.decode('ibm850')正确解码命令行数据。

注意:从Python3.5开始,Popen允许为数据流传递编码,这是Python3.4所缺乏的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59197284

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档