我正在尝试使用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+í¦vt
为window 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;
}
答案 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 *。