我目前正在将脚本从 Perl 迁移到 Python3 (3.6.5)。Is 在 Windows Server 2016 上运行。该脚本使用参数构建命令行,并使用subprocess.check_output. 参数选项之一称为-location:"my street"。该位置可以包含特殊字符,例如元音变音 (\xc3\xa4\xc3\xb6\xc3\x9f) 或 (\xc3\xa1\xc5\xa0)。
当我运行 Perl 脚本时,特殊字符会正确传递到应用程序。当我运行 Python 脚本时,特殊字符将被应用程序中的问号替换。我认为被调用的应用程序需要一个 UTF-8 编码的参数字符串。
\n\nPerl 脚本以 UTF-8 模式运行
\n\nuse UTF8;\nbinmode( STDOUT, ":utf-8" );\nRun Code Online (Sandbox Code Playgroud)\n\nPython脚本是用PyCharm创建的,UTF-8编码,脚本的第一行包含
\n\n# -*- coding: utf-8 -*-\nRun Code Online (Sandbox Code Playgroud)\n\n我尝试了多种方法将子进程参数的编码设置为 UTF-8,但它不起作用。我曾经procmon.exe比较过 Perl 和 Python 脚本之间的应用程序调用。我可以看到,在 procmon 中为 Python 子进程调用显示的命令行对我来说是可读的。工作 Perl 调用不。在 procmon 中查找 perl 脚本的位置字符串如下所示:
-location:"HQ/\xc3\x83\xc2\xa4\xc3\x83\xc2\xb6\xc3\x83\xc2\xb6\xc3\x83\xc2\xb6Stra\xc3\x83\xc5\xb8e"。
Perl 代码如下所示:
\n\n$command = "C:\\\\PROGRAM FILES\\\\Application\\\\bin\\\\cfg.exe"\n$operand = "-modify -location:123\xc3\xa1456\xc3\x9f99"\n$result = …Run Code Online (Sandbox Code Playgroud)