Zlib 解决中文乱码的问题

2019-04-17  本文已影响0人  l蓝色梦幻

在项目开发过程中使用了 ZLIB 进行文件解压缩。但在解压含有中文文件名称的 zip 压缩包时,解压的文件名出现乱码的情况。

网上的方法

网上搜到了方案是将 zip.cpp 和 unzip.cpp 下的字符做 UTF-8 与 Unicode 之间的转换。如下:

zip.cpp

WideCharToMultiByte(CP_UTF8,0,dstzn,-1,zfi.iname,MAX_PATH,0,0);

unzip.cpp

WideCharToMultiByte(CP_UTF8,0,tname,-1,name,MAX_PATH,0,0);

我们实现的方式

我们实现的方法与上面类似。首先我们代码中存在有宽窄字符转换的方法:

std::wstring CharToWchar(const char* c, size_t m_encode) {
    std::wstring str;
    int len = MultiByteToWideChar(m_encode, 0, c, strlen(c), NULL, 0);
    wchar_t*    m_wchar = new wchar_t[len + 1];
    MultiByteToWideChar(m_encode, 0, c, strlen(c), m_wchar, len);
    m_wchar[len] = '\0';
    str = m_wchar;
    delete m_wchar;
    return str;
}

std::string WcharToChar(const wchar_t* wp, size_t m_encode) {
    std::string str;
    int len = WideCharToMultiByte(m_encode, 0, wp, wcslen(wp), NULL, 0, NULL, NULL);
    char    *m_char = new char[len + 1];
    WideCharToMultiByte(m_encode, 0, wp, wcslen(wp), m_char, len, NULL, NULL);
    m_char[len] = '\0';
    str = m_char;
    delete m_char;
    return str;
}

然后我们根据需要对读取出来的字符做了编码转换:

std::wstring a = CharToWchar(filename_inzip, CP_UTF8);
std::string ch = WcharToChar(a.c_str());

至此:ch 就是已经转换过了的字符串了。

上一篇下一篇

猜你喜欢

热点阅读