Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Windows文件名在Linux中显示损坏的字符_Python_Linux_Unicode_Encoding_Utf 8 - Fatal编程技术网

Python Windows文件名在Linux中显示损坏的字符

Python Windows文件名在Linux中显示损坏的字符,python,linux,unicode,encoding,utf-8,Python,Linux,Unicode,Encoding,Utf 8,我相信这是Linux和Windows上字符默认编码的常见问题。然而,在我搜索了互联网之后,我没有任何简单的方法来自动修复它,因此我准备写一个脚本来完成它 以下是场景: 我在Windows系统上创建了一些文件,其中一些文件的名称不是英文的(在我的例子中是中文)。我用7-zip把它们压缩成一个zip文件。之后,我将zip文件下载到Linux上,并在Linux系统(Ubuntu 16.04 LTS)(默认存档程序)上解压缩文件。正如我所猜测的,所有非英语文件名现在都显示为一些损坏的字符!起初,我认为使

我相信这是Linux和Windows上字符默认编码的常见问题。然而,在我搜索了互联网之后,我没有任何简单的方法来自动修复它,因此我准备写一个脚本来完成它

以下是场景:

我在Windows系统上创建了一些文件,其中一些文件的名称不是英文的(在我的例子中是中文)。我用7-zip把它们压缩成一个zip文件。之后,我将zip文件下载到Linux上,并在Linux系统(Ubuntu 16.04 LTS)(默认存档程序)上解压缩文件。正如我所猜测的,所有非英语文件名现在都显示为一些损坏的字符!起初,我认为使用convmv应该很容易,但是

我试过convmv,它说:“跳过,已经是utf8了”。什么都没变

然后,我决定使用Python编写一个工具来完成这项肮脏的工作,经过一些测试,我发现我无法将原始文件名与损坏的文件名相关联(除非通过散列内容)

这里有一个例子。我在Windows上设置了一个Web服务器来列出文件名,其中一个文件在python中用“gbk”编码后显示为

u'j\u63a5\u53e3\u6587\u6863'
我可以在我的Linux系统上查询文件名。我可以用上面显示的名称直接创建一个文件,并且名称是正确的。我还可以将unicode gbk字符串编码为utf8编码并创建一个文件,名称也正确。(因此,我不能同时做这些事情,因为它们确实是同一个名字)。现在当我读到我之前提取的文件名时,它应该是同一个文件。但文件名完全不同,如下所示:

'j\xe2\x95\x9c\xe2\x95\x99.....'
用utf8对其进行解码,类似于u'j\u255c\u2559…'。使用gbk对其进行解码会导致UnicodeDecodeError异常,我也尝试使用utf8对其进行解码,然后使用gbk进行编码,但结果仍然是其他的

总而言之,在将原始文件名提取到linux系统后,我无法通过解码或编码来检查原始文件名。如果我真的想让一个程序来完成这项工作,我要么用一些可能的编码选项重新进行归档,要么只使用我的脚本,但使用文件内容散列(如md5或sha1)来确定其在Windows上的原始文件名


除了比较两个系统之间的文件内容外,我是否还有机会从上述情况下的python脚本中推断出原始名称?

通过对常用编码的一点尝试,我能够逆转您的:

gbk
-通用中文Windows编码
cp437
-常见的美国Windows OEM控制台编码

utf8
-常见的Linux编码

重复其他问题:在Internet上搜索“zip文件和unicode文件名”。你不是第一个遇到这个问题的人。没有任何东西像
unicode gbk
u'j\u63a5\u53e3\u6587\u6863'
会产生:
'j接口文档'。是这样吗?另外,你是在创建7zip格式的档案(.7z)还是PKWARE Zip档案(.Zip)?哇,这太棒了!当我尝试cp936时,我从未想过cp437。非常感谢。
bad = 'j\xe2\x95\x9c\xe2\x95\x99\xe2\x94\x90\xe2\x94\x8c\xe2\x95\xac\xe2\x94\x80\xe2\x95\xa1\xe2\x95\xa1'
>>> good = bad.decode('utf8').encode('cp437').decode('gbk')
>>> good
u'j\u63a5\u53e3\u6587\u6863'        # u'j接口文档'