【问题标题】:Python 2 encoding in win 7 consoleWin 7 控制台中的 Python 2 编码
【发布时间】:2018-09-15 12:22:30
【问题描述】:

这个问题与Getting file path with umlauts from command line arguments under win7 using a batch file 有关,但有另一个转折点。我安装了 win_unicode_console。我打开了一个控制台窗口并通过 chcp.com 65001 > nul 更改了代码页,然后我在带有变音符号的路径中启动了一个 python 脚本,该脚本在此控制台中运行良好,但程序抛出此错误:

Traceback (most recent call last):
File "C:\path\to\script.py",
line 205, in <module>
print err
File "C:\python27\lib\site-packages\win_unicode_console\streams.py", line 256,
in write
self.base.write(s)
File "C:\python27\lib\site-packages\win_unicode_console\streams.py", line 216,
in write
return self.base.write(s)
File "C:\python27\lib\site-packages\win_unicode_console\streams.py", line 165,
in write
raise exc
WindowsError:

程序抱怨“打印错误”,因为这是我尝试捕获异常的方式:

try:
    ... main code ...
except Exception, err:
    print err

在...主要代码...部分有一行

print 'ausgewählte Konfiguration:'

这个 'ä' 字符会导致错误,但我不明白为什么。我尽我所能使编码正确,但控制台输出使一切崩溃。

如果我不按照 eryksun 的建议通过 chcp 更改控制台的代码页,则错误消失但出现了新问题。 该脚本接收包含特殊字符(如“ä”)的文件路径。该脚本首先打开文件没有问题,但无法写回数据

'utf8' codec can't decode byte 0xe4 in position 4: invalid continuation byte

【问题讨论】:

  • 你有win_unicode_console,为什么要使用代码页65001?控制台对代码页 65001 的实现在多个 Windows 版本中都存在很多问题。
  • 因为你建议它 ;-) 你在stackoverflow.com/questions/49445992 上评论说,如果我想调用一个执行接收命令行参数的 python 脚本的 Windows 批处理脚本,我应该更改控制台的代码页与元音变音。我将编辑我的问题以显示如果我不更改代码页会发生什么。
  • 我强调代码页只能在批处理脚本中临时更改为 65001,即更改为 65001 以将命令行读入 Unicode 环境变量,然后切换回原始代码页。运行外部程序时,不应将其留在代码页 65001。
  • 好吧,我误解了。但无论如何,我没有可以关闭 chcp 的后续命令,结果证明我无论如何都不必打开它,这显然是最好的选择。感谢您的帮助。
  • 即使您没有将批处理脚本保存为 UTF-8,如果您不小心,仍然可能会出现 mojibake 问题。默认情况下,CMD 使用控制台输出代码页来解码默认为 OEM 的批处理脚本,但这可以在注册表或快捷方式设置中进行更改,用户可能已通过 chcp.com 或 mode.com 进行了更改。因此,无论如何,使用非 ASCII 字符的批处理脚本必须确保活动代码页与其保存的代码页相同。

标签: python windows python-2.7 encoding windows-console


【解决方案1】:

好的,我找到了一种可行的方法。按原样使用文件路径,导致 Unicodedecodeerror 但使用后

filepath.decode('mbcs')

现在一切正常。

实际上,我不明白为什么会这样。我猜想命令行参数的处理是由 win_unicode_console 完成的。这就是脚本可以从命令行读取包含“ä”的文件路径的原因。它可能已经使用代码页 850 (?) 进行了编码,然后将文件路径保存在对象属性中。 python 脚本尝试使用 utf-8 对其进行解码,但失败了,这就是我必须首先解码 windows 编码的原因。然后用utf-8解码成功。也许有人可以更详细地阐明这一点。

【讨论】:

  • 在 Python 2 中,win_unicode_console.enable(use_unicode_argv=True) 从本机 Unicode 命令行设置 sys.argv。随后它应该由unicode 字符串组成,不应被解码。
  • 是的,我在 win_unicode_console 的文档中读到过,但没有尝试。我已将 win_unicode_console.enable() 添加到 ..Lib/site-packages/usercostomize.py 这似乎现在可以使用,但正如您之前指出的那样,这仅适用于德语点字符,因为如果我有它们包含在 windows 编解码器中使用希腊路径名我的解决方案不起作用。
猜你喜欢
  • 1970-01-01
  • 2018-08-13
  • 1970-01-01
  • 1970-01-01
  • 2023-03-06
  • 2015-11-19
  • 1970-01-01
  • 2021-06-16
  • 1970-01-01
相关资源
最近更新 更多