压缩包一打开,满屏文件名全是“锟斤拷”“烫烫烫”,或者解压出来的Word、Excel打开全是方格子和问号——这应该是每个用电脑的人都碰到过的事。尤其是从网上下载的资料包、同事微信传过来的项目代码、客户发来的设计素材,什么场景都能遇到。今天这篇文章,我就把“解压缩乱码”这事彻底掰开揉碎讲清楚,从原理到实操,从Windows到Linux,从改名到批量修复,一次性给你讲明白了。
先说结论:解压缩出现乱码,本质就两件事,要么是压缩包里的文件名编码和你系统当前使用的编码对不上,要么是文件内容本身的编码被错误转换了。搞明白这个核心逻辑,后面所有操作其实都是围绕“让编码对上号”展开的。
这篇文章适合谁看?平时用WinRAR、7-Zip、Bandizip、macOS自带的归档实用工具解压文件遇到乱码的用户,以及需要在Linux服务器上解压别人发来的压缩包、需要批量处理大量文件名的运维和开发同学。我会从原理讲起,到具体的工具配置、命令行参数、脚本代码,最后再分享几个我踩过的坑,尽量一篇讲透。
1. 乱码的本质:先搞懂你的文件是怎么变成乱码的
1.1 字符编码基础:从ASCII到Unicode
很多同学一看到“编码”两个字就头大,觉得是程序员才需要理解的东西。其实就是个简单的约定:计算机只认识0和1,想要显示文字,就得给每个字编一个号码,这个“号码表”就是编码方案。
最早有ASCII码,那会儿美帝发明的,用7个二进制位就能装下英文字母、数字和标点符号。后来中国也要用电脑,但中文字符几千个,ASCII码装不下,于是出现了GB2312、GBK、GB18030这一系列中文编码方案。GBK用两个字节表示一个汉字,兼容ASCII。同一时期,台湾地区用了Big5(俗称繁体中文编码),日本有Shift-JIS,韩国有EUC-KR。这些方案各自为政,互不兼容——同一个二进制数字,在GBK里可能是一个汉字,在Big5里可能是另一个字,这就是乱码的总根源。
后来国际标准化组织觉得这样下去不行,就搞了Unicode标准,给世界上几乎所有语言的字符都编了统一的号码。但号码怎么存储又是另一个问题:如果全部用固定4字节存,英文字母就得白白浪费3个字节。于是又有了UTF-8、UTF-16这些存储方案。UTF-8的优势在于完全兼容ASCII,英文还是1字节,中文用3字节,现在是互联网和现代操作系统的主流方案。
我用一个生活化的类比帮你理解:你把一封信交给快递员,信上的地址是用简体中文写的。结果快递员只会读繁体中文,他按繁体字去翻译地址,最后把信送到了完全不同的地方。压缩包里的文件名就是这个“地址”,创建压缩包时用的编码,和后来解压时系统用的编码不是同一套,乱码就来了。
1.2 解压缩乱码的两条主线:文件名乱码与文件内容乱码
解压缩遇到的乱码可以粗暴地分成两大类,因为它们的处理和修复思路完全不同。
第一类是文件名乱码。就是说压缩包也能正常解压,文件也能正常打开,但压缩包里显示的文件名是“鍚夋灄澶у”这种看不懂的字符。原因是创建压缩包时,压缩软件把文件名用GBK编码存了进去(Windows中文系统默认GBK),而解压时用的工具或系统默认按UTF-8解码,两边对不上。这类问题最常出现在:老版本WinRAR在中文Windows系统下创建的zip包,后来拿到macOS上解压;或者反过来,macOS打包的zip在Windows上解压。好消息是这类乱码通常只影响文件名,文件内容本身没有问题。
第二类是文件内容乱码。就是文件名看着正常,但打开文件后任何文字都是乱码。这种情况比较复杂,可能是文件在打包前就已经是乱码了,也可能是解压工具在处理某些特殊文件(比如文本文件)时错误地进行了编码转换。比如一个原本是GBK编码的txt文件,被误识别成了UTF-8并做了转码,内容就彻底坏了。还有一种常见情况是压缩包里有关键字是“ANSI”编码的文本,某些工具解压时会自作主张转换成UTF-8,转坏了。
这里要特别提醒一个概念:很多压缩工具在解压时不会自动识别文件名编码,它们只会按照系统默认的代码页来处理。只要创建压缩包的环境和解压的环境“语言”不一致,文件名乱码几乎是必然的。所以定位问题的第一步,一定是搞清楚“这个压缩包是在什么系统上、用什么软件打的”,然后再决定用什么策略解压。
2. 解压缩场景中的乱码定位:先判断问题出在哪一环
2.1 常见场景一:压缩包里的文件名乱码
当你下载了一个压缩包,一打开发现文件名是乱的,先别急着愤怒删除。我一般会按这个顺序排查:
第一步,看压缩包扩展名。是.zip还是.rar还是.7z?不同格式的处理难度完全不一样。ZIP格式因为历史原因,文件名编码并没有硬性标准,很多老工具默认用的是本地系统的编码;RAR格式稍微好一点,WinRAR在打包时会写入编码信息;7z格式对新标准的支持更好,但老版本工具也可能出问题。
第二步,看看其他工具能不能识别。如果你用的是Windows资源管理器自带的解压功能出现乱码,换7-Zip或者Bandizip再打开试试。因为Windows资源管理器默认用当前系统区域设置的编码去解码ZIP包里的文件名,如果你的系统区域是中文(GBK),它对UTF-8编码文件名的ZIP包就会显示乱码;而Bandizip这类工具内置了编码自动检测,能自动识别GBK和UTF-8。
第三步,如果你会用命令行,可以用unzip -l先列出压缩包里的文件名看看显示效果。在Linux下还可以用unzip -O参数强制指定编码,这个我后面细讲。通过多种工具交叉验证,基本能判断压缩包里的文件名到底是以什么编码存储的。
2.2 常见场景二:解压后的文件内容乱码
如果文件名正常,但打开文件内容是乱码,这个就要分析你对文件内容的预期编码是什么了。
举个例子,你从一个老网站上DZ论坛下载了一个txt小说包,解压后用记事本打开发现中文全是乱码。这种情况十有八九是txt文本的编码是GBK,而你用的编辑器默认用UTF-8打开。这个还真不一定是解压的锅,因为你把原始txt文件拿过来直接双击打开也会一个样。解决办法很简单:用VSCode、Notepad++这类编辑器右下角点击“UTF-8”,选择“通过编码重新打开”,选GBK或GB2312,内容瞬间正常。
还有一类情况是纯二进制文件,比如PDF、Word文档、图片。这些文件如果解压后文件名正常,内容打不开或显示乱码,那大概率是文件损坏了,或者解压时工具做了一些“多余的事”。对于这类文件,我建议只用标准解压模式,不要勾选任何自动转码选项。7-Zip、Bandizip默认的解压行为是安全的,但某些国产压缩软件有“智能转码”功能,反而会把二进制文件搞坏。
2.3 平台差异:Windows、macOS、Linux谁最容易出乱码
这个话题特别值得展开,因为不同平台创建和解压压缩包的“语言环境”太不一样了。
Windows中文版系统的默认编码体系是GBK(更准确说是CP936),很多老软件创建的ZIP包,文件名都是以本地代码页编码存储。macOS和现代Linux发行版则全面拥抱了UTF-8,系统默认用UTF-8解码ZIP包。所以Windows和macOS/Linux之间互相传压缩包,是最容易触发文件名乱码的场景。方向不同,乱码表现也不同:
- Windows打包 → macOS解压:文件名显示为乱码,因为macOS用UTF-8去解GBK编码的文件名。
- macOS/Linux打包 → Windows解压:文件名显示为乱码,因为Windows用GBK去解UTF-8编码的文件名。
- 新的Windows 11部分版本资源管理器对UTF-8的兼容好了很多,但还没好到完全没有问题。
还有一类情况是同一平台内部的乱码,比如Windows用国产压缩软件(比如360压缩、快压)打包,然后Windows又用WinRAR解压,偶尔也会出问题。原因是一些国产工具在ZIP包里用了非标准的编码标记,或者干脆不写编码标记,导致其他工具靠猜。
Linux和macOS的用户如果长期在终端工作,我强烈建议把unzip替换成支持编码检测的工具,或者在命令里手动指定编码,不然每次解压Windows传来的包都是一场赌博。
3. 实操:几种解压缩乱码的快速解决方案
3.1 Windows下的工具选择与配置
如果你还在用Windows系统自带“全部解压缩”那个功能,强烈建议换掉。它在处理中文ZIP包时的表现实在是过于“原教旨”——完全不检测编码,只看系统区域设置。系统的区域设置是中文(简体,中国),它就按GBK来,你拿到一个UTF-8编码文件名的ZIP包,它就摆烂给你看。
性能排序下来,我个人首推Bandizip。它有自动检测文件名编码的功能,打开压缩包时如果检测到当前系统编码和压缩包内部编码不一致,会弹窗提示你是否要自动修复文件名,点一下“修复”,所有乱码文件名立刻恢复正常。这个功能在处理那种混合压缩包(一部分名字正常,一部分是乱码)时尤其给力。
如果你不想装新软件,7-Zip也可以,但它默认不会自动修复编码,需要手动调整:打开7-Zip,菜单栏“工具” → “选项” → “7-Zip”标签页,找到“默认代码页”,把“UTF-8”改成“CP936”(对应中文GBK),或者反过来试——总之让解压工具的代码页和压缩包创建方的代码页保持一致就行。这个改动会影响所有压缩包的解压行为,改完不想用了记得改回来。
最后还有一个“笨办法”,但也很有效:修改Windows系统区域设置,勾选“Beta: 使用Unicode UTF-8提供全球语言支持”,系统重启后,整个系统对UTF-8编码文件名的支持会明显提升。但这个改动会影响一部分老软件的字体显示,甚至会导致某些不支持UTF-8的软件出现新乱码,建议只在确实需要批量处理大量UTF-8压缩包时临时开启,搞完就关掉。
3.2 Linux下用命令行处理乱码压缩包
Linux用户在服务器上解压Windows传来的ZIP包,几乎每个人都被乱码折磨过。这里有几个实际的命令行方案,结合具体命令说明:
方案一:直接指定编码解压。GNU unzip有一个-O参数可以指定字符编码:
# 解压GBK编码文件名的ZIP包 unzip -O GBK filename.zip # 或者更明确地,指定CP936 unzip -O CP936 filename.zip如果unzip版本比较老不支持-O参数,可以升级p7zip,然后用7z命令:
7z x filename.zip -o./output_dir7z自带的编码检测能力比老unzip强不少,很多情况下它能自动处理好。
方案二:先解压后改名。如果压缩包已经解压了,文件名一团乱,可以用convmv批量转换文件名编码:
# 递归转换当前目录下所有文件名从GBK到UTF-8 convmv -f GBK -t UTF-8 -r --notest ./--notest参数很关键,不加它convmv只做演练,不会真正改名。注意这个命令只能处理文件名,不会动文件内容。
方案三:用Python脚本原生解决。比如用zipfile库遍历压缩包,对每个文件名先按GBK解码再重新编码,解压到本地。这种方式比较灵活,可以用在不能安装第三方工具的干净环境里。我写了一个示例放在下文“批量处理与自动化脚本”小节,可以直接复制改改。
3.3 批量处理与自动化脚本:一次性搞定一堆乱码压缩包
很多朋友拿到的是“一个文件夹里几十个压缩包,每个都是乱码”的绝望场景。手动一个一个解压太累了,这时候就得写个小脚本批量处理。
我以Python为例,写一个定期清理运维同事发来的各种文件名乱码压缩包的脚本:它扫描指定目录下所有.zip文件,读取压缩包内的文件名,按GBK尝试解码,如果失败就按UTF-8解码,解压时把乱码文件名替换成正常文件名:
import zipfile import os import sys def extract_zip_with_encoding(zip_path, output_dir, src_enc='GBK'): """ 解压ZIP文件并修复乱码文件名 :param zip_path: zip文件路径 :param output_dir: 解压输出目录 :param src_enc: 压缩包文件名原始编码,默认GBK """ os.makedirs(output_dir, exist_ok=True) with zipfile.ZipFile(zip_path, 'r') as zf: for info in zf.infolist(): # 尝试用指定编码解码文件名 try: decoded_name = info.filename.encode('cp437').decode(src_enc) except (UnicodeDecodeError, UnicodeEncodeError): # 如果失败,说明文件名本来就是Unicode decoded_name = info.filename # 防止路径穿越,清理路径 safe_name = decoded_name.replace('..', '_') target_path = os.path.join(output_dir, safe_name) # 如果是目录,先创建目录 if info.is_dir(): os.makedirs(target_path, exist_ok=True) continue # 确保父目录存在 os.makedirs(os.path.dirname(target_path), exist_ok=True) # 解压文件 with zf.open(info.filename) as src, open(target_path, 'wb') as dst: dst.write(src.read()) print(f"已解压: {zip_path}") def batch_extract(folder): for root, _, files in os.walk(folder): for fname in files: if fname.endswith('.zip'): zip_path = os.path.join(root, fname) output_dir = os.path.join(root, fname[:-4] + '_解压') extract_zip_with_encoding(zip_path, output_dir, src_enc='GBK') if __name__ == '__main__': if len(sys.argv) > 1: folder = sys.argv[1] else: folder = '.' batch_extract(folder)第13行这里有个技巧,info.filename.encode('cp437')是因为Python的zipfile模块在处理乱码文件名时,会把原始字节错误地解码成cp437字符,所以我们先把它还原成字节流,再用正确的编码解码。这个方法不是100%可靠,但对绝大多数GBK/UTF-8混用的情况都能救回来。
如果你更习惯用Linux shell组合拳,也可以:先把zip包解压出来(即使文件名乱码),再用convmv批量改编码,或者用find -exec配合mv改名。
3.4 使用macOS时的处理技巧
macOS自带的“归档实用工具”在解压ZIP包时,其实是按照它内置的逻辑处理的。对老式的GBK编码ZIP包,它经常乱码,但新版的macOS在部分版本中又导入了对CP437的兼容逻辑,所以表现很不稳定。我在macOS上遇到乱码时,一般优先用ditto命令:
# 使用系统自带的ditto命令解压,它支持指定编码 ditto -V -x -k --sequesterRsrc --rsrc archive.zip ./output_dir-k表示ZIP格式,--sequesterRsrc是为了兼容macOS的Resource Fork。不过ditto对中文ZIP包的支持也有限,更靠谱的还是装The Unarchiver或者Keka,这俩工具对中文文件名编码的兼容性是macOS上表现最好的。如果你在Windows上打包然后传到macOS上解压,最省心的做法就是打包时选ZIP格式,并且在Windows上开启“Beta: 使用Unicode UTF-8提供全球语言支持”,这样打出来的包文件名基本是UTF-8编码,macOS解压毫无压力。
4. 乱码问题的延伸场景:编辑器、IDE、数据库、串口,一个都不能少
解压乱码只是冰山一角,实际工作中,乱码出现的场景远不止解压缩。我在搜资料时看到搜索词里还有“VSCode中文显示乱码”“Tomcat乱码”“pythonsql写入数据库中文是乱码”“minicom乱码”“rs232乱码”“ArcGIS导入CAD文字乱码”等等。既然今天已经把“乱码”这个话题聊透了,我就顺着把几个高频场景一次性讲完,让你以后遇到乱码不再手足无措。
4.1 编辑器与IDE乱码:VSCode、CLion、DevC++这一挂
VSCode用户遇到中文乱码,90%的情况是你打开的这个文件不是UTF-8编码,而VSCode默认按UTF-8解码。解决方案有两种:
第一种,临时解决当前文件:点击编辑器右下角的编码信息按钮(默认显示“UTF-8”),弹出菜单选择“通过编码重新打开”,然后选“GBK”或“GB2312”,内容正常了。如果你希望以后这个文件每次都按GBK打开,可以再次点击编码按钮,选择“通过编码保存”,把文件另存为UTF-8。
第二种,永久解决自动猜测编码问题:在设置里搜files.autoGuessEncoding,把它设为true。这样VSCode在打开文件时会自动检测编码(通过BOM、字节分布等信号),乱码概率大幅下降。不过它不是万能的,对于GBK和UTF-8之间的选择,即使用了自动检测也有可能猜错,尤其是短文件,信号太少,猜错的概率不低。
CLion和IntelliJ家的IDE在Windows上也会出中文乱码,常见于控制台输出。这个通常是控制台的编码和系统的代码页不一致导致的。可以试试在“Help” → “Edit Custom VM Options”里加上一行-Dfile.encoding=UTF-8,重启IDE。如果还不行,检查Run/Debug Configurations里的“VM options”是否有类似-Dfile.encoding=GBK的配置。DevC++现在用的人少了,但如果你还在用老版本DevC++写中文输出(尤其是printf),控制台乱码基本上是编辑器默认编码和控制台代码页不匹配的问题。把编辑器默认编码改为“UTF-8”,再把编译选项加-fexec-charset=GBK,能解决大多数问题。
4.2 数据库乱码:MySQL、Oracle、PostgreSQL的输入输出
数据库中文乱码的原因,本质上是一个“三段一致”问题:客户端编码、连接编码、数据库表编码,这三段只要有一环不一致,中文就会变成问号或者乱码。
以Python + MySQL为例,你在写入数据时遇到中文乱码,排查顺序如下:先看表结构编码:SHOW CREATE TABLE your_table,确认是utf8mb4。然后在连接数据库时,在连接字符串里明确指定编码:
import pymysql conn = pymysql.connect( host='localhost', user='root', password='your_password', database='your_db', charset='utf8mb4' )然后在建表的时候,也明确指定DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_unicode_ci。最后,如果还有乱码,检查你用来查看数据的终端或者客户端工具的编码。MySQL命令行默认的编码可能和你的数据不一致,可以执行:
SET NAMES utf8mb4;如果你用PL/SQL Developer查Oracle视图看到乱码,要么是Oracle客户端的NLS_LANG设置和数据库字符集不匹配,要么是PL/SQL Developer的编码设置问题。通常需要把环境变量NLS_LANG设置为和数据库一致的字符集,比如NLS_LANG=SIMPLIFIED CHINESE_CHINA.AL32UTF8,或者在PL/SQL Developer的“首选项” → “用户界面” → “字体”里把字体设置成支持中文的字体。
4.3 串口和嵌入式终端的乱码:minicom和RS232
这个场景熟悉嵌入式开发的兄弟姐妹一定不陌生。开发板接上串口终端,满屏中文全变成方块和问号,只有英文正常。这类问题十有八九是波特率没调好或者终端编码不对。
串口通信的波特率双方必须一致,比如都设成115200,否则就会出现乱码(这种乱码不是编码问题,是数据采样的错位,表现是所有字符都是乱码,不只是中文)。确认波特率无误后,再看终端工具的编码设置。minicom默认的编码可能不是UTF-8,你可以按Ctrl+A进入设置,找到“字符编码”选项,把“UTF-8”选上。如果minicom还不正常,试一下stty -F /dev/ttyUSB0 115200 cs8 -cstopb -parenb,确认串口参数是“8N1”(8数据位、无校验、1停止位),这是最常见的串口配置。开发板端的uboot或者Linux内核默认可能输出GBK编码,你在终端里用UTF-8解码,自然乱码。这种情况要么在开发板端设置输出UTF-8,要么在终端端切换到GBK解码。我用过的一款帮客户做的国产开发板,它上电输出的是GBK编码的中文,但如果用MobaXterm却显示正常,原因就是MobaXterm自动检测了编码,而Windows的超级终端没有,所以换了终端工具后乱码瞬间消失。
4.4 特殊场景:PDF文档、中文注释、GIS数据
再快速扫几个搜索词里的高频场景。用Edge浏览器打开PDF,部分特殊字符变成乱码:这种情况多是PDF内嵌字体的问题,或者PDF文件本身用了非标准编码。用Chrome/Edge打开时,它没法正确识别字体映射。如果你是在开发环境生成PDF,很可能是因为生成PDF时指定的字体库不支持中文,老外常用的Helvetica、Times在中文PDF里就会出方块。修复思路是换用中文字体(宋体、思源黑体等)重新生成,或者用Adobe Acrobat做一次“打印为PDF”修复字体嵌入。
Vivado在Windows上写中文注释,综合仿真后注释全乱码。这是Vivado编辑器默认按系统区域编码读取源文件,如果你文件是UTF-8保存的,它却按GBK读,自然乱。在Vivado的“Tools” → “Settings” → “Text Editor”里把默认文件编码改成“UTF-8”,重新打开文件显示就正常了。
ArcGIS导入CAD文字乱码:CAD文件(DWG/DXF)中的文字有自己独特的编码历史,老的DXF文件用的是ANSI,新版本可能是UTF-8。ArcGIS在导入DXF时,如果检测不到正确的编码,文字就会变成乱码。可以在导入前先用CAD软件把文字转换为单行文本,或者用FME、Global Mapper这类工具先把DXF转成带正确编码的Shapefile,再导入ArcGIS。
这些场景虽然不全是解压的问题,但它们有个共同的根:编码信息丢失或错配。只要你理解了编码的基本逻辑,排查方向基本不会跑偏。
5. 常见问题速查表与避坑经验
我把实际工作中遇到的典型问题和解决方案整理成一个速查表,方便你以后直接查阅。
| 现象 | 常见原因 | 快速解决 |
|---|---|---|
| Windows解压zip文件名乱码 | zip包文件名是UTF-8,系统按GBK解码 | 用Bandizip解压,弹窗选“修复编码”;或改系统区域为UTF-8 |
| macOS解压zip文件名乱码 | zip包文件名是GBK,系统按UTF-8解码 | 用The Unarchiver解压,自动识别编码 |
| Linux解压zip文件名乱码 | 没有指定编码 | unzip -O GBK 强制指定编码 |
| 解压后txt文件打开乱码 | 文件内容编码不是UTF-8 | 用编辑器选择“通过编码重新打开”,选GBK |
| 解压后Word/PDF文件打不开或乱码 | 二进制文件损坏或工具转码出错 | 关闭压缩软件的“智能转码”功能,重新解压 |
| VSCode打开文件乱码 | 默认按UTF-8读GBK文件 | 设置files.autoGuessEncoding=true |
| Python写MySQL中文乱码 | 数据库表或连接字符串不是utf8mb4 | 连接字符串加charset=utf8mb4,建表指定utf8mb4 |
| 串口终端显示乱码 | 波特率或终端编码不对 | 确认波特率一致,终端设为UTF-8或GBK |
| Vivado中文注释乱码 | 编辑器默认编码不是UTF-8 | Settings里改Text Editor默认编码为UTF-8 |
| Edge打开PDF部分字符乱码 | PDF内嵌字体不正常 | 换PDF阅读器,或用PDF编辑器修复字体 |
接下来分享几个关于解压缩的实用避坑经验,这些是文档里一般不写的:
第一,创建一个压缩包之前,先想好它会在哪里被解压。如果你只是自己用,爱用啥编码都行;如果你要把压缩包发给别人,尽量用现代工具(7-Zip、Bandizip、WinRAR 5.x以上)选择ZIP格式,并且留意工具的“文件名编码”选项,优先使用UTF-8。这样做至少能保证当前主流系统都能正常解压。
第二,压缩软件换编码试试。某些国产压缩软件在打包时会给你中文文件名加BOM或者非标准头,看起来很贴心,实际上却导致其他工具不认。我在帮别人修复压缩包时,最常用的操作就是用Bandizip打开包,点“修复”按钮,80%的文件名乱码问题能直接修好。它的内置智能编码检测引擎在中文场景下确实做得比其他工具好。
第三,永远不要在别人的压缩包里直接改文件名。如果压缩包里的文件名乱码,先正常解压出来,再用文件管理器或批量改名工具(比如ReNamer、Advanced Renamer)修改文件名。虽然有些压缩工具支持“重命名压缩包内的文件”,但操作不当容易损坏压缩包结构,而且修改后的压缩包再解压时可能又触发新的编码问题。解压出来再改名是最安全的路径。
第四,如果你收到的压缩包里的文件名是那种“鍚夋灄澶у”样式,可以用在线转码工具先转一下编码试试。把乱码字符复制到支持编码转换的网站上(比如某些在线“GBK转UTF-8”工具),然后手动改回去。这个方法适合少量文件,大量文件还是用脚本批量处理。
第五,解压工具尽量少选“自动转码”“智能解压”这类选项。我记得有个版本的某国产压缩软件默认开启了“智能解压”,导致用户解压一个包含大量JPEG图片的压缩包后,所有图片都损坏了,因为工具在解压时尝试将所有文件按文本编码重新处理了一遍。压缩软件就干好解压这一件事就行,转码你不是专业的。
最后再分享一个我刚工作时踩过的坑
刚参加工作那会儿,给客户部署环境,他们把整个Linux服务器上的数据打成了tar.gz包发过来,我解压后在全系统找到了上千个文件名乱码的配置文件。当时我一个个手动去改名,改了快一上午还没弄完。后来前辈看到,让我用convmv一行命令批量转编码,两秒钟全部搞定。从此我养成了一个习惯:任何一批需要批量处理的任务,先停下来想想有没有办法用工具批量做,而不是当文档搬运工。
那次经历让我彻底搞懂了tar.gz和zip完全不一样——GNU tar打包的时候会保留原始文件名编码,解包时不会做任何转码,所以tar.gz反而不会出现zip那种文件名乱码(前提是你的文件系统支持存储非UTF-8文件名)。后来我在教团队里的人排查乱码问题时,总是让他们先回去搞清楚“数据源是什么编码、当前环境在用什么编码”,把这个搞清楚了,乱码问题就已经解决了一半。
希望这篇关于解压缩乱码的实战总结能帮到你。如果你也有什么难搞的乱码场景,或者遇到这篇文章没覆盖到的情况,欢迎在评论区留言,我们一起讨论。