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

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

利益相关:做包管理器解压 ZIP 刚好做过编码检测自动转换。
openmynet
148 天前
如果会 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