[已解决]python 修复文件名乱码问题

Python/PHP/Perl 开发与设计
回复
x565178035
帖子: 19
注册时间: 2013-04-05 23:11
系统: ubuntu
送出感谢: 0
接收感谢: 0

[已解决]python 修复文件名乱码问题

#1

帖子 x565178035 » 2014-09-28 16:13

我试图用python修复文件名乱码的问题,但decode("gbk").encode("utf-8")后还是乱码,不知道什么问题.ori:
ÈéÆ·1401.xls
ÂÃÓÎ1401.xls
ÂÃÓÎ1402.xls
ÂÃÓÎ1403.xls
Åëâ¿1401.xls
Åëâ¿1402.xls
Åëâ¿1403.xls
Åëâ¿1404.xls
Åëâ¿1405.xls
ÓªÑø1401.xls
ʳ°²1401.xls
ʳ°²1402.xls
ʳ¹¤1401.xls
ʳ¹¤1402.xls
decode:
脠茅脝路1401.xls
脗脙脫脦1401.xls
脗脙脫脦1402.xls
脗脙脫脦1403.xls
脜毛芒驴1401.xls
脜毛芒驴1402.xls
脜毛芒驴1403.xls
脜毛芒驴1404.xls
脜毛芒驴1405.xls
脫陋脩酶1401.xls
脢鲁掳虏1401.xls
脢鲁掳虏1402.xls
脢鲁鹿陇1401.xls
脢鲁鹿陇1402.xls

源码:
utf.py
(490 Bytes) 下载 197 次
目标文件:
zh.zip
(1.58 KiB) 下载 158 次
上次由 x565178035 在 2014-10-21 12:43,总共编辑 2 次。
头像
lilydjwg
论坛版主
帖子: 4164
注册时间: 2009-04-11 23:46
系统: Arch Linux
送出感谢: 11 次
接收感谢: 127 次
联系:

Re: python 修复文件名乱码问题

#2

帖子 lilydjwg » 2014-10-02 15:28

弄明白你在干什么。你把什么东西当作 GBK 解码了?
[bash]xsel | iconv -t latin1 | iconv -f gbk[/bash]

你没有给出代码,所以我也不知道你在干什么。
jinjiachen
帖子: 2116
注册时间: 2012-12-16 15:43
系统: debian
送出感谢: 9 次
接收感谢: 27 次

Re: python 修复文件名乱码问题

#3

帖子 jinjiachen » 2014-10-03 8:01

是2还是3版本 开头有加编码吗
x565178035
帖子: 19
注册时间: 2013-04-05 23:11
系统: ubuntu
送出感谢: 0
接收感谢: 0

Re: python 修复文件名乱码问题

#4

帖子 x565178035 » 2014-10-06 8:43

lilydjwg 写了:弄明白你在干什么。你把什么东西当作 GBK 解码了?
[bash]xsel | iconv -t latin1 | iconv -f gbk[/bash]

你没有给出代码,所以我也不知道你在干什么。
Source code:
#!/usr/bin/env python
#coding= utf-8
#Edit by Anemone at :
#Sun Sep 28 14:48:12 CST 2014
#E-mail:x565178035@126.com
import os
import sys
def VisitDir(path):
li = os.listdir(path)
for p in li:
pathname = os.path.join(path,p)
if not os.path.isfile(pathname):
VisitDir(pathname)
else:
print p.decode("gbk").encode("utf-8")
print p
def main():
path = r"/root/tmp"
VisitDir(path)
if __name__ == '__main__':
main()
头像
astolia
论坛版主
帖子: 4105
注册时间: 2008-09-18 13:11
送出感谢: 1 次
接收感谢: 683 次

Re: python 修复文件名乱码问题

#5

帖子 astolia » 2014-10-06 19:31

实际上关键在于你解压缩的时候就要设置好编码
LANG=C unzip zh.zip
或者用7zip
LANG=C 7z x zh.zip
x565178035
帖子: 19
注册时间: 2013-04-05 23:11
系统: ubuntu
送出感谢: 0
接收感谢: 0

Re: python 修复文件名乱码问题

#6

帖子 x565178035 » 2014-10-06 20:27

astolia 写了:实际上关键在于你解压缩的时候就要设置好编码
LANG=C unzip zh.zip
或者用7zip
LANG=C 7z x zh.zip
LANG=C是什么意思 我用了好像报错啊...can not open output file
头像
astolia
论坛版主
帖子: 4105
注册时间: 2008-09-18 13:11
送出感谢: 1 次
接收感谢: 683 次

Re: python 修复文件名乱码问题

#7

帖子 astolia » 2014-10-07 14:51

不要解压到fat/ntfs文件系统上。
头像
lilydjwg
论坛版主
帖子: 4164
注册时间: 2009-04-11 23:46
系统: Arch Linux
送出感谢: 11 次
接收感谢: 127 次
联系:

Re: python 修复文件名乱码问题

#8

帖子 lilydjwg » 2014-10-07 20:37

x565178035 写了: Source code:
#!/usr/bin/env python
#coding= utf-8
#Edit by Anemone at :
#Sun Sep 28 14:48:12 CST 2014
#E-mail:x565178035@126.com
import os
import sys
def VisitDir(path):
li = os.listdir(path)
for p in li:
pathname = os.path.join(path,p)
if not os.path.isfile(pathname):
VisitDir(pathname)
else:
print p.decode("gbk").encode("utf-8")
print p
def main():
path = r"/root/tmp"
VisitDir(path)
if __name__ == '__main__':
main()
代码请用代码标签,像这样最好了:
[python]
#!/usr/bin/env python
#coding= utf-8
#Edit by Anemone at :
#Sun Sep 28 14:48:12 CST 2014
#E-mail:x565178035@126.com
import os
import sys
def VisitDir(path):
li = os.listdir(path)
for p in li:
pathname = os.path.join(path,p)
if not os.path.isfile(pathname):
VisitDir(pathname)
else:
print p.decode("gbk").encode("utf-8")
print p
def main():
path = r"/root/tmp"
VisitDir(path)
if __name__ == '__main__':
main()[/python]

你使用 print 作为关键字,所以你在使用 Python 2。

你把文件名作为 GBK 编码的文本来解码,然后以 UTF-8 来编码。但问题是,你的文件名是 GBK 编码的吗?答案是:不是。你的文件名是乱码。


解压程序以为它是 UTF-8 编码的,于是以 UTF-8 编码存在文件系统里了。所以你要先解 UTF-8 编码,恢复原本的数据。但是解码之后的内容是 unicode。我们要让 Python 把它里边的每一个字符当成一个编码未知的字节,所以使用 latin1 再编码一次,然后再解 GBK 编码:

[python]
>>> print p.decode('utf-8').encode('latin1').decode('gbk')
乳品1401.xls
[/python]

后边 astolia 设置 LANG=C,告诉解压程序系统的编码是 C 规定的那个,相当于一字节一字符的 latin1 编码。(现代 Linux 默认的编码是 UTF-8;你如果使用 LANG=zh_CN.gbk 并且设置终端使用 GBK 编码来显示字符的话,也是可以看到正确显示的文件名的。)

解压来自 Windows 简体中文版的 zip 包,可以使用 gbkunzip 程序。
x565178035
帖子: 19
注册时间: 2013-04-05 23:11
系统: ubuntu
送出感谢: 0
接收感谢: 0

Re: python 修复文件名乱码问题

#9

帖子 x565178035 » 2014-10-09 16:59

lilydjwg 写了:
x565178035 写了: Source code:
#!/usr/bin/env python
#coding= utf-8
#Edit by Anemone at :
#Sun Sep 28 14:48:12 CST 2014
#E-mail:x565178035@126.com
import os
import sys
def VisitDir(path):
li = os.listdir(path)
for p in li:
pathname = os.path.join(path,p)
if not os.path.isfile(pathname):
VisitDir(pathname)
else:
print p.decode("gbk").encode("utf-8")
print p
def main():
path = r"/root/tmp"
VisitDir(path)
if __name__ == '__main__':
main()
代码请用代码标签,像这样最好了:
[python]
#!/usr/bin/env python
#coding= utf-8
#Edit by Anemone at :
#Sun Sep 28 14:48:12 CST 2014
#E-mail:x565178035@126.com
import os
import sys
def VisitDir(path):
li = os.listdir(path)
for p in li:
pathname = os.path.join(path,p)
if not os.path.isfile(pathname):
VisitDir(pathname)
else:
print p.decode("gbk").encode("utf-8")
print p
def main():
path = r"/root/tmp"
VisitDir(path)
if __name__ == '__main__':
main()[/python]

你使用 print 作为关键字,所以你在使用 Python 2。

你把文件名作为 GBK 编码的文本来解码,然后以 UTF-8 来编码。但问题是,你的文件名是 GBK 编码的吗?答案是:不是。你的文件名是乱码。


解压程序以为它是 UTF-8 编码的,于是以 UTF-8 编码存在文件系统里了。所以你要先解 UTF-8 编码,恢复原本的数据。但是解码之后的内容是 unicode。我们要让 Python 把它里边的每一个字符当成一个编码未知的字节,所以使用 latin1 再编码一次,然后再解 GBK 编码:

[python]
>>> print p.decode('utf-8').encode('latin1').decode('gbk')
乳品1401.xls
[/python]

后边 astolia 设置 LANG=C,告诉解压程序系统的编码是 C 规定的那个,相当于一字节一字符的 latin1 编码。(现代 Linux 默认的编码是 UTF-8;你如果使用 LANG=zh_CN.gbk 并且设置终端使用 GBK 编码来显示字符的话,也是可以看到正确显示的文件名的。)

解压来自 Windows 简体中文版的 zip 包,可以使用 gbkunzip 程序。
但我更改后代码显示UnicodeDecodeError:'ascii' codec can't decode byte 0xd6 in position 0:oridinal not in range(128)
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙
送出感谢: 4 次
接收感谢: 256 次

Re: python 修复文件名乱码问题

#10

帖子 eexpress » 2014-10-10 10:10

你这文件复制过程中,就已经乱码了。
● 鸣学
x565178035
帖子: 19
注册时间: 2013-04-05 23:11
系统: ubuntu
送出感谢: 0
接收感谢: 0

Re: python 修复文件名乱码问题

#11

帖子 x565178035 » 2014-10-10 14:00

eexpress 写了:你这文件复制过程中,就已经乱码了。
求linux下解压win的zip的正确方式。。。
头像
lilydjwg
论坛版主
帖子: 4164
注册时间: 2009-04-11 23:46
系统: Arch Linux
送出感谢: 11 次
接收感谢: 127 次
联系:

Re: python 修复文件名乱码问题

#12

帖子 lilydjwg » 2014-10-13 0:03

x565178035 写了: 但我更改后代码显示UnicodeDecodeError:'ascii' codec can't decode byte 0xd6 in position 0:oridinal not in range(128)
请贴 Traceback。
头像
lilydjwg
论坛版主
帖子: 4164
注册时间: 2009-04-11 23:46
系统: Arch Linux
送出感谢: 11 次
接收感谢: 127 次
联系:

Re: python 修复文件名乱码问题

#13

帖子 lilydjwg » 2014-10-13 0:03

x565178035 写了:
eexpress 写了:你这文件复制过程中,就已经乱码了。
求linux下解压win的zip的正确方式。。。
我不是说了 gbkunzip 吗?
头像
lilydjwg
论坛版主
帖子: 4164
注册时间: 2009-04-11 23:46
系统: Arch Linux
送出感谢: 11 次
接收感谢: 127 次
联系:

Re: python 修复文件名乱码问题

#14

帖子 lilydjwg » 2014-10-13 0:08

Cf. https://bbs.archlinuxcn.org/viewtopic.p ... 472#p20472 让我们来讨论一下「为什么很多人都不会寻找帮助」如何?
x565178035
帖子: 19
注册时间: 2013-04-05 23:11
系统: ubuntu
送出感谢: 0
接收感谢: 0

Re: python 修复文件名乱码问题

#15

帖子 x565178035 » 2014-10-21 12:42

lilydjwg 写了:Cf. https://bbs.archlinuxcn.org/viewtopic.p ... 472#p20472 让我们来讨论一下「为什么很多人都不会寻找帮助」如何?
谢谢 问题已解决!
回复

回到 “Python/Php/Perl”