在Windows上打开,关闭和复制unicode文件

时间:2018-10-16 18:55:56

标签: python-2.7 unicode

当尝试执行单独的操作来打开另一个程序中的文件,关闭另一个程序中的文件并执行系统操作(例如,基于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)作为复制方法。

1 个答案:

答案 0 :(得分:0)

好的...我终于弄清楚了,将在下面提供警告。我已经从另一个程序复制并粘贴了文件名。

此文件名中的前两个字符未合并(ÉürøFile.fmp12)。因此它被编码为E´和u¨。代替É和ü。显然,在尝试基于该文件名执行命令行时,Python 2.7无法处理未合并的字符。

所以这里的警告是:

  1. 在Python中使用repr()函数了解字符串的编码方式。
  2. 使用支持所需编码风格的工具
  3. 比较值时,请确保比较的两面都支持相同的unicode样式(组合或分解)。
  4. 最后查找错误所指向的字符。我没有...但是如果我做了...我会发现unicode字符0301是一个重音字符。此字符:´

作为此问题的后续,我发现了另一个问题。更正了上面的代码后,我正尝试使用Python的内置zip实用程序来保护unicode文件名。将文件存储在zip文件中,然后在需要时使用unicode文件名解压缩文件。这显然是Windows上的Python 2.7中的错误。当内置解压缩实用程序的Python解压缩文件时,它弄乱了磁盘上文件名的编码(在Mac上运行正常)。该名称在Windows上变得微不足道,并且未被系统实用程序(例如,使用copy,mv,getSize等)识别。我的解决方法是将带有欧洲名称和亚洲名称的松散测试文件放在SMB卷上的文件夹中,并让我的代码工作直接在他们身上。更多的经验教训。我希望将来可以使用Python 3,并且基于文件的问题更少。