flutter archive 只能解码 utf8 编码的 zip,中文编码压缩的就跪了,有办法吗

2023-12-12 18:49:45 +08:00
 hikarugo
很多 windows 上压缩的包都打不开,很头疼啊,有懂的兄弟指点一下吗
1850 次点击
所在节点    程序员
15 条回复
shimanooo
2023-12-12 18:53:27 +08:00
解完自己转码文件名不行吗?
hikarugo
2023-12-12 18:58:45 +08:00
@shimanooo 不能要求用户做这个操作啊,太麻烦了
ysc3839
2023-12-12 18:59:49 +08:00
hikarugo
2023-12-12 19:17:44 +08:00
@ysc3839 请教一下,链接代码块上面写着 Charsets for [ZipFile.extractToDirectory],是不是只针对 extractToDirectory 这个方法有效呢,我想在不解压 zip 的情况下,直接读取 zip 里面的图片,可以实现吗,我目前是使用 ZipDecoder().decodeBuffer(InputFileStream(zipPath)),然后碰到非 utf8 的就抛异常了 FormatException: Unexpected extension byte
hikarugo
2023-12-12 19:19:27 +08:00
@ysc3839 咱们说的好像不是一个库,我用的是 https://pub.dev/packages/archive 这个😂
AoEiuV020JP
2023-12-12 19:58:03 +08:00
zip 自身不包含编码信息就挺坑的,我估计你只能,放弃那个库,
找找有没有国人写的,肯定就支持了,
最好得来个有猜测编码功能的库,
hikarugo
2023-12-12 20:03:56 +08:00
@AoEiuV020JP 问题是没有啊哈哈,最坏情况就是自己写了,他们那种猜测功能咋做的,比如 maczip 就能正常解码中文的,但是 mac 自带的就不行
AoEiuV020JP
2023-12-12 20:06:39 +08:00
@fyxtc #7 我看了一下那个库,已经有国人提 pr 了,但是半年没动静,你可以考虑直接使用这人未被合并的分支版本,
https://github.com/brendan-duncan/archive/pull/248
hikarugo
2023-12-12 21:27:59 +08:00
@AoEiuV020JP 非常感谢!用他的包大部分都能解了,居然还有的解不出来,服了,zip 不指定编码真的坑
hikarugo
2023-12-12 21:33:50 +08:00
@AoEiuV020JP 估计是 GB18030 编码的。。。gbk 解不动,真的醉了哈哈
cleanery
2023-12-13 09:58:43 +08:00
@AoEiuV020JP zip 自身是可以包含编码信息的, 但是不是强制的选项.
打包时, winrar 是默认带上的, 7zip 不是.
7zip 打包 zip 的时候,加上 -mu 参数, 就会用 unicode 保存 zip 文件名编码了
cleanery
2023-12-13 10:02:11 +08:00
cleanery
2023-12-13 10:04:43 +08:00
概括下是这个意思
如果不加 cu=on
7zip 打包 zip 的时候,会默认用 ANSI 保存文件名然后在额外区域保存 UTF-8 文件名
如果加了 cu=on 那么就只用 UTF-8 保存文件名
这样你在 linux 上就不会出错了
forcecharlie
2023-12-13 10:28:17 +08:00
ZIP 可以强制使用 UTF8 编码,这个时候在单个条目中会设置特殊的字段,其他时候就是 codepage ,一般而言与压缩和解压的代码页有关,如果你的是 CP936 ,压缩的 codepage 不是这个就可能乱码,正确的做法是 all UTF-8 ,但历史原因都做的不好,有一种解决方案,对文件名做编码检测,解压时自动转换,这个很少有 ZIP 解压软件做到。

利益相关:做包管理器解压 ZIP 刚好做过编码检测自动转换。
openmynet
2023-12-13 14:37:30 +08:00
如果会 rust 配合 flutter_rust_bridge 处理这些问题简直不要太香,zip 直接在 rust 层面做了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/999784

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX