用于文件名的 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\x74
是 S+í¦vt
在 window 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*.
我正在尝试使用 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\x74
是 S+í¦vt
在 window 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*.