美文网首页
Zlib 解决中文乱码的问题

Zlib 解决中文乱码的问题

作者: l蓝色梦幻 | 来源:发表于2019-04-17 09:20 被阅读0次

    在项目开发过程中使用了 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 就是已经转换过了的字符串了。

    相关文章

      网友评论

          本文标题:Zlib 解决中文乱码的问题

          本文链接:https://www.haomeiwen.com/subject/vifgwqtx.html