V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
fyxtc
V2EX  ›  程序员

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

  •  
  •   fyxtc · 2023-12-12 18:49:45 +08:00 · 1471 次点击
    这是一个创建于 382 天前的主题,其中的信息可能已经有所发展或是发生改变。
    很多 windows 上压缩的包都打不开,很头疼啊,有懂的兄弟指点一下吗
    15 条回复    2023-12-13 14:37:30 +08:00
    shimanooo
        1
    shimanooo  
       2023-12-12 18:53:27 +08:00
    解完自己转码文件名不行吗?
    fyxtc
        2
    fyxtc  
    OP
       2023-12-12 18:58:45 +08:00
    @shimanooo 不能要求用户做这个操作啊,太麻烦了
    ysc3839
        3
    ysc3839  
       2023-12-12 18:59:49 +08:00 via Android
    fyxtc
        4
    fyxtc  
    OP
       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
    fyxtc
        5
    fyxtc  
    OP
       2023-12-12 19:19:27 +08:00
    @ysc3839 咱们说的好像不是一个库,我用的是 https://pub.dev/packages/archive 这个😂
    AoEiuV020JP
        6
    AoEiuV020JP  
       2023-12-12 19:58:03 +08:00
    zip 自身不包含编码信息就挺坑的,我估计你只能,放弃那个库,
    找找有没有国人写的,肯定就支持了,
    最好得来个有猜测编码功能的库,
    fyxtc
        7
    fyxtc  
    OP
       2023-12-12 20:03:56 +08:00
    @AoEiuV020JP 问题是没有啊哈哈,最坏情况就是自己写了,他们那种猜测功能咋做的,比如 maczip 就能正常解码中文的,但是 mac 自带的就不行
    AoEiuV020JP
        8
    AoEiuV020JP  
       2023-12-12 20:06:39 +08:00   ❤️ 1
    @fyxtc #7 我看了一下那个库,已经有国人提 pr 了,但是半年没动静,你可以考虑直接使用这人未被合并的分支版本,
    https://github.com/brendan-duncan/archive/pull/248
    fyxtc
        9
    fyxtc  
    OP
       2023-12-12 21:27:59 +08:00
    @AoEiuV020JP 非常感谢!用他的包大部分都能解了,居然还有的解不出来,服了,zip 不指定编码真的坑
    fyxtc
        10
    fyxtc  
    OP
       2023-12-12 21:33:50 +08:00
    @AoEiuV020JP 估计是 GB18030 编码的。。。gbk 解不动,真的醉了哈哈
    cleanery
        11
    cleanery  
       2023-12-13 09:58:43 +08:00
    @AoEiuV020JP zip 自身是可以包含编码信息的, 但是不是强制的选项.
    打包时, winrar 是默认带上的, 7zip 不是.
    7zip 打包 zip 的时候,加上 -mu 参数, 就会用 unicode 保存 zip 文件名编码了
    cleanery
        12
    cleanery  
       2023-12-13 10:02:11 +08:00
    cleanery
        13
    cleanery  
       2023-12-13 10:04:43 +08:00
    概括下是这个意思
    如果不加 cu=on
    7zip 打包 zip 的时候,会默认用 ANSI 保存文件名然后在额外区域保存 UTF-8 文件名
    如果加了 cu=on 那么就只用 UTF-8 保存文件名
    这样你在 linux 上就不会出错了
    forcecharlie
        14
    forcecharlie  
       2023-12-13 10:28:17 +08:00
    ZIP 可以强制使用 UTF8 编码,这个时候在单个条目中会设置特殊的字段,其他时候就是 codepage ,一般而言与压缩和解压的代码页有关,如果你的是 CP936 ,压缩的 codepage 不是这个就可能乱码,正确的做法是 all UTF-8 ,但历史原因都做的不好,有一种解决方案,对文件名做编码检测,解压时自动转换,这个很少有 ZIP 解压软件做到。

    利益相关:做包管理器解压 ZIP 刚好做过编码检测自动转换。
    openmynet
        15
    openmynet  
       2023-12-13 14:37:30 +08:00
    如果会 rust 配合 flutter_rust_bridge 处理这些问题简直不要太香,zip 直接在 rust 层面做了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   922 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 21:36 · PVG 05:36 · LAX 13:36 · JFK 16:36
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.