分页: 1 / 1

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

发表于 : 2014-09-28 16:13
x565178035
我试图用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) 已下载 263 次
目标文件:
zh.zip
(1.58 KiB) 已下载 209 次

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

发表于 : 2014-10-02 15:28
lilydjwg
弄明白你在干什么。你把什么东西当作 GBK 解码了?
[bash]xsel | iconv -t latin1 | iconv -f gbk[/bash]

你没有给出代码,所以我也不知道你在干什么。

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

发表于 : 2014-10-03 8:01
jinjiachen
是2还是3版本 开头有加编码吗

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

发表于 : 2014-10-06 8:43
x565178035
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:[email protected]
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()

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

发表于 : 2014-10-06 19:31
astolia
实际上关键在于你解压缩的时候就要设置好编码
LANG=C unzip zh.zip
或者用7zip
LANG=C 7z x zh.zip

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

发表于 : 2014-10-06 20:27
x565178035
astolia 写了:实际上关键在于你解压缩的时候就要设置好编码
LANG=C unzip zh.zip
或者用7zip
LANG=C 7z x zh.zip
LANG=C是什么意思 我用了好像报错啊...can not open output file

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

发表于 : 2014-10-07 14:51
astolia
不要解压到fat/ntfs文件系统上。

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

发表于 : 2014-10-07 20:37
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:[email protected]
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:[email protected]
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 程序。

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

发表于 : 2014-10-09 16:59
x565178035
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:[email protected]
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:[email protected]
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)

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

发表于 : 2014-10-10 10:10
eexpress
你这文件复制过程中,就已经乱码了。

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

发表于 : 2014-10-10 14:00
x565178035
eexpress 写了:你这文件复制过程中,就已经乱码了。
求linux下解压win的zip的正确方式。。。

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

发表于 : 2014-10-13 0:03
lilydjwg
x565178035 写了: 但我更改后代码显示UnicodeDecodeError:'ascii' codec can't decode byte 0xd6 in position 0:oridinal not in range(128)
请贴 Traceback。

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

发表于 : 2014-10-13 0:03
lilydjwg
x565178035 写了:
eexpress 写了:你这文件复制过程中,就已经乱码了。
求linux下解压win的zip的正确方式。。。
我不是说了 gbkunzip 吗?

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

发表于 : 2014-10-13 0:08
lilydjwg
Cf. https://bbs.archlinuxcn.org/viewtopic.p ... 472#p20472 让我们来讨论一下「为什么很多人都不会寻找帮助」如何?

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

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