列出带有特殊字符(如表情符号)的 zip 文件条目

List zip file entries with special characters like emojis

我正在编写需要列出 zip 文件中的文件条目的脚本。我的问题是,当有一个带有表情符号的条目时,CLI 没有正确输出文件名:

❯ zip -r foo.zip test/
  adding: test/ (stored 0%)
  adding: test/.txt (stored 0%)

src on main [!?] is  v1.0.0 via  v16.14.0 
❯ unzip -l foo.zip 
Archive:  foo.zip
  Length      Date    Time    Name
---------  ---------- -----   ----
        0  04-08-2022 20:54   test/
        0  04-08-2022 20:54   test/�???.txt  <---- here is my problem
---------                     -------
        0                     2 files

src on main [!?] is  v1.0.0 via  v16.14.0 
❯ unzip foo.zip test/.txt
Archive:  foo.zip
 extracting: test/�???.txt

有没有办法告诉 unzip 考虑特殊字符列出文件条目?

谢谢!

使用 unzip 似乎无法准确列出 zip 存档中的文件(使用 unzip 6.00 测试);你必须 select 其他工具。

我在回答中选择了perl,因为它的核心库中具有所需的功能。这里我使用了 newline 作为分隔符 (-l),但是如果你希望能够读取和处理输出的路径,你应该用 NULL-BYTE (-l0) 替换它100% 准确来自 bash:

perl -l -e '
    use IO::Uncompress::Unzip;
    $zip = IO::Uncompress::Unzip->new($ARGV[0]);
    while($zip->nextStream()) {
        print $zip->getHeaderInfo()->{Name}
    }
' foo.zip
test/
test/.txt

备注: Python 在其核心库中也有一个 ZipFile 模块。由于 stdout 的编码问题,我没有 post 任何 Python 解决方案。 Python 版本之间的修复不兼容...