【发布时间】:2018-10-16 18:55:55
【问题描述】:
在尝试对在另一个程序中打开文件、关闭另一个程序中的文件以及执行系统操作(例如在基于 unicode 的文件名上复制文件)执行单独操作时,我遇到了以下错误。我当前的代码在 Macintosh 上运行良好,但在 Windows 上却不行。我刚开始使用 unicode 文件名和 CLI。
UnicodeEncodeError: 'ascii' codec can't encode character u'\u0301' in position 5: ordinal not in range(128)
另一个应用程序示例中的简化关闭文件如下所示:
def CloseFile( fileToClose ):
cmd = [ 'sudo', fmsadmin, 'close', fileToClose, '-u', 'userName', '-p', 'accountName', '-y' ]
subprocess.check_output( cmd )
CloseFile( u'ÉürøFile.fmp12' )
我尝试在设置 cmd 变量之前执行解码,但这不起作用。
fileToClose = fileToClose.decode('utf-8')
如果你愿意,我可以给你一个 CopyFile() 示例,但是在调用命令之前就会出现错误。因此,您无需安装 FileMaker Server 即可重现该问题。
我正在使用 shutil.copy( from, to ) 作为复制方法。
【问题讨论】:
-
如果
fileToClose变量的类型是unicode,你肯定需要encode(),而不是decode()。而且我不确定 Windows 是否使用 UTF-8 作为文件名。 -
@lenz 是的,这就是我想要弄清楚的。我也尝试过 fileToClose = fileToClose.encode(sys.stdout.encoding) 但最终出现同样的错误。在编码行而不是子进程行。
-
AFAIK,STD 通道的编码与文件系统的文件名编码无关,此外,与
subprocess委托的系统调用使用的编码无关。你见过this thread吗? -
是的,我做到了。那里没有关于如何安装建议的补丁的建议。我尝试安装它。我还将所有代码移至 Popen 并没有解决问题。我在应用补丁时猜测,所以不确定补丁是否被使用。我采取的步骤记录在补丁页面上。
-
如果该答案中的第一个答案是正确的,那么切换到 Python 3 可能会有所帮助。这不是一个选择吗?无论如何,你迟早要迁移到 Py3。
标签: python-2.7 unicode