【发布时间】: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