Linux下使用unzip解压缩中文乱码问题
2023-09-14 08:59:42 时间
使用info-zip.org 的 unzip类 解压zip压缩包,如果压缩包中有中文文件名,那么解压这些文件出来时文件名是乱码的。
分析:
参考这篇文章 让Unzip正确解压其中包含中文文件名的Winzip压缩包 ,原因是unzip试图将zip文件中用 oem(ibm-dos) codepage 编码的文件名转换成自己的内部编码。可惜unzip只能转换极少数几种codepage,中文的 cp936 不在其列。
如果您的系统还未编译安装Unzip调试发现问题出现在MultiByteToWideChar方法里,
如 MultiByteToWideChar(CP_ACP,0,fn,-1,tfn,MAX_PATH); 到这里时fn中的name属性值还是正常的,在这个方法内部执行完tfn就乱了。
解决方法:
打开unzip.cpp源文件,找到函数
ZRESULT TUnzip::Get(int index,ZIPENTRY *ze) // ...... // ......
把 CP_UTF8 改为CP_ACP, ( CP_ACP 指示要使用当前设置的 API 默认 Windows ANSI 代码页)
重新编译后
这样就解决了解压中文文件名称乱码的问题
编译时解决源码问题(无需更改源码)上面的情况,我们我观察到unzip源代码这段开始的地方有判断
#ifndef Ext_ASCII_TO_Native
这样问题似乎更简单了,不用改源代码,只需在make时定义 Ext_ASCII_TO_Native 即可,这样 Ext_ASCII_TO_Native 实际为一个空的宏,不进行任何转换操作。
比如,使用下面的方法编译
make -DExt_ASCII_TO_Native
或者在bash执行下面两行
export LOCAL_UNZIP=-DExt_ASCII_TO_Native
通过unzip行命令解压,指定字符集
unzip -O CP936 xxx.zip (用GBK, GB18030也可以)方法二 在环境变量中,指定unzip参数
在环境变量中,指定unzip参数,总是以指定的字符集显示和解压文件
/etc/environment中加入2行
UNZIP=”-O CP936″ ZIPINFO=”-O CP936″
复制以下内容(Python)保存未myuzip.py文件脚本,并修改运行权限为可运行(chmod +x uzip)
#!/usr/bin/env python # -*- coding: utf-8 -*- # uzip.py 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()
180606-Linux下jdk中文乱码问题解决 之前遇到过一次中文乱码问题,是通过在jdk的jre目录下的lib/fonts文件中添加simsun.ttf字体文件解决,但是这次遇到一个奇怪的问题,同样的字体拷贝过去后,中文不乱但是英文乱码了 记录一下解决过程: 主要思路就是给系统安装中文字体,让系统本身就支持中文即可
Mac Terminal ssh连接linux服务器中文乱码 整理了近期在项目上做的一些技术研究,希望与大家共同探讨交流。 场景:Mac OSterminal 本地中文显示正常ssh 登陆linux,服务器中文显示乱码 尝试解决:方法1. (未解决)在本地与服务器执行 locale 命令, 发现字符编码一致,都是 zh_CN.UTF-8。
相关文章
- Linux安装:自由、灵活、强大(linux安装linux)
- 探索Linux模拟终端的无限可能(linux模拟终端)
- 解决Linux汉字乱码的方法(linux汉字乱码)
- 探索 Linux 的神秘彩蛋(linux彩蛋)
- 解决Linux系统字体乱码问题(linux字体乱码)
- 性能Linux系统 I/O性能测试(linux测试io)
- 解决Linux下中文乱码问题(中文乱码linux)
- Linux终端下如何显示中文(linux下显示中文)
- 管理Linux下实现高效的并发连接管理(linux并发连接)
- 开启 Linux 系统安全之旅(linux系统安全优化)
- 重新启动Linux:权威reboot命令法(linux重新启动命令)
- 25字中文文章标题:Linux 如何快速关闭进程(linux关闭进程命令)
- Linux下的中文字符之旅(linux中文字符)
- Linux中文显示简易指南(linux如何显示中文)
- 解决Linux安装过程中出现乱码问题(linux安装乱码)
- 入门Linux,从0基础开始的学习体验(0基础学习linux)
- 探索Linux软件世界:中文化的必要性与方法(linux软件中文)
- Linux学习宝典:开启你的操作系统之旅(linux学习宝典)
- 25字中文文章标题:掌握技巧:如何远程连接 Linux 系统?(linux系统如何远程)
- Linux网络安装:轻松引导您至完美安装(linux网络安装引导)
- Linux双摄像头:双重视野直观体验(linux双摄像头)