linux下tar文件解压乱码,解决Linux/macOS下zip文件解压中文乱码

一.原因

很多网站下载的zip文件都是在Windows下打包的,这就为乱码的出现埋下了铺垫。这个问题表面上是由于Windows(中文系统)下使用cp936也就是GBK编码,而Linux以及macOS下使用UTF-8编码,但是追根究底还是因为zip格式在设计之初就没有为文件编码预留存储数据的位置,导致解压程序在解压时只能依照系统编码进行解压,这种情况下一旦跨平台解压就可能导致中文乱码。

二.解决

以下方法来自知乎——>传送门

①.unzip修改版

首先建议尝试unzip是不是自带转码的版本,这个版本在CentOS上直接yum install unzip貌似就是了,部分系统中是unzip-iconv,还请自行尝试

unzip -O cp936 test.zip

1

unzip-Ocp936test.zip

如果支持就直接解压出来了,不支持就会跳参数出来

②.unar(并不是unrar, 请看好)

这个在macOS上用brew能装,CentOS7用yum,不过6貌似就没有现成的了

unar test.zip

1

unartest.zip

③bsdtar(arch下是libarchive)

CentOS下可能为bsdtar3,我测试6是这样的,7没试,可以yum search bsdtar看看

bsdtar xvf archive.zip

1

bsdtarxvfarchive.zip

④.p7zip+convmv

LANG=C 7za x test.zip

convmv -f GBK -t utf8 --notest -r .

1

2

LANG=C7zaxtest.zip

convmv-fGBK-tutf8--notest-r.

⑤.python

原贴有人提到这个方案有风险,见仁见智吧

#!/usr/bin/env python

# -*- coding: utf-8 -*-

import os

import sys

import zipfile

#print "Processing File " + sys.argv[1]

file=zipfile.ZipFile(sys.argv[1],"r");

for name in file.namelist():

utf8name=name.decode('gbk')

# print "Extracting " + utf8name

pathname = os.path.dirname(utf8name)

if not os.path.exists(pathname) and pathname!= "":

os.makedirs(pathname)

data = file.read(name)

if not os.path.exists(utf8name):

fo = open(utf8name, "w")

fo.write(data)

fo.close

file.close()

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

#!/usr/bin/env python

# -*- coding: utf-8 -*-

importos

importsys

importzipfile

#print "Processing File " + sys.argv[1]

file=zipfile.ZipFile(sys.argv[1],"r");

fornameinfile.namelist():

utf8name=name.decode('gbk')

#    print "Extracting " + utf8name

pathname=os.path.dirname(utf8name)

ifnotos.path.exists(pathname)andpathname!="":

os.makedirs(pathname)

data=file.read(name)

ifnotos.path.exists(utf8name):

fo=open(utf8name,"w")

fo.write(data)

fo.close

file.close()

保存为unzip.py然后chmod+x unzip.py执行./unzip.py test.zip

你可能感兴趣的:(linux下tar文件解压乱码)