在 Windows 上打开、关闭和复制 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 服务器来重现该问题。

我正在使用shutil.copy( from, to (作为复制方法。

好的...我终于想通了这一点,并将在下面提供警告。 我从另一个程序复制并粘贴了文件名。

此文件名中的前两个字符未组合 (ÉürøFile.fmp12(。 所以它被编码为 E'and 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,并且基于文件的问题更少。

最新更新