用于文件名的 Minizip 和 Unicode

Minizip and Unicode for filenames

我正在尝试使用 Minizip. If a file with a troublesome file name, that is a name with at least one charactar that is not in ASCII is compressed, the name of the file in the archive is messed up. I red How to convert minizip wrapper to unicode? 压缩具有非 ASCII 文件名的文件,并更改了源代码,以便将标志 11 设置为 true,但没有什么不同。

举例说明问题:

文件 中文 在 zip 存档中被命名为 S+í¦vt

或十六进制:

\x53\x2B\xA1\xB5\xFB\xE7\x53\x2b\xed\xa6\x76\x74 前两个十六进制相同但后四个不同。 \x53\x2b\xed\xa6\x76\x74S+í¦vtwindow 1252

程序中的文件名被硬编码为\x53\x2B\xA1\xB5\xFB\xE7(中文),以消除输入错误的风险。

文件名中仅包含 ASCII 字符的文件在 zip 存档中按应有的方式命名。由于压缩包中的文件名比原始文件名长,我假设使用了另一种编码,然后使用 UTF-8。

由于计算机中的所有符号实际上都只是二进制字符串,所以我希望一个十六进制字符串能够输出正确的文件名。这里的问题是我不知道文件名是如何在 zip 存档中编码的。

有谁知道如何从 hex/UTF-8to 进行正确的翻译以及使用哪种编码?

我认为 zip 存档使用 OS 标准编码,在我的例子中是 Windows-1252。

 const char kChineseSampleText[] = "\x53\x2B\xA1\xB5\xFB\xE7";

 if ( open_file( zipF, kChineseSampleText ) )
 {
     //write to file
 }



 bool open_file( const zipFile zipFile, const char* fileName)
 {
     zip_fileinfo zfi;
     int status = zipOpenNewFileInZip( zipFile, fileName , NULL, &zfi, NULL, 0, NULL, 0, Z_DEFLATED,  Z_DEFAULT_COMPRESSION );

      if( status != ZIP_OK ) 
      {     
           zipClose( zipFile, NULL ); 
           return false;
      } 
      true;
 }

首先,考虑从哪里获取文件名。通常,WINAPI 函数确实有 ANSI 和 Unicode 版本,分别由后缀 'A' 或 'W' 标识。你通常看不到它,因为它是编译器的工作。您可以通过将 'A' 附加到函数来强制它为 ANSI,例如 FindNextFileA(好吧,我认为您正在列出一个带有 FindFirstFile 的文件夹)。

如果无法识别源格式,请调用IsTextUnicode(fileName, fileNameSize, NULL)检查文件名是否为Unicode格式。如果是,调用 WideCharToMultiByte(CP_OEMCP, 0, fileName, fileNameSize, ansiFileName, ansiFileNameSize, 0, NULL).

希望这对您有所帮助,抱歉英语不好。

Window 的标准压缩程序无法处理 Unicode,因此它将二进制字符串读取为 window-1252。 7-zip 以 Unicode 解释二进制字符串!

事实证明我的程序一直有效。我唯一做的就是将标志 11 设置为 true。我没有修改其他任何东西,比如使用 wchar_t 指针而不是 char*.