Minizip和Unicode用于文件名

时间:2015-07-16 16:56:43

标签: c windows character-encoding

我正在尝试使用Minizip压缩非ASCII文件名的文件。如果文件名有问题的文件,即至少有一个非ASCII字符的名称被压缩,则存档中文件的名称会混乱。我红色How to convert minizip wrapper to unicode?并更改了源代码,以便将标志11设置为true,但它没有任何不同。

说明问题的一个例子:

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

或者以十六进制:

\x53\x2B\xA1\xB5\xFB\xE7\x53\x2b\xed\xa6\x76\x74 前两个十六进制是相同的但不是后四个。 \x53\x2b\xed\xa6\x76\x74

中的S+í¦vtwindow 1252

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

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

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

有没有人知道如何从十六进制/ UTF-8到正确的转换以及使用哪种编码?

我认为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;
 }

2 个答案:

答案 0 :(得分:0)

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

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

希望这有助于对不起的英语抱歉。

答案 1 :(得分:0)

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

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