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
就是已经转换过了的字符串了。