隐藏英雄 发表于 2022-12-29 17:54

C++求解6

本帖最后由 隐藏英雄 于 2022-12-29 17:56 编辑


我使用zip和unzip类进行解压,可以成功解压 但是会出现解压中文乱码和失败问题,谁有什么好的MFC C++ 解压方法和代码吗,分享一下,下面是找到的一个号称修复了中文乱码问题的文件 可是他这个文件本身就报错了
str未定义
文件下载地址 https://pan.baidu.com/s/1dH1sgZehG2Tb_2EZ-pdF8Q?pwd=dxek         提取码dxek


char *tchar_to_utf8(const TCHAR *str, char szStr)
{
#ifdef _UNICODE
      int size = WideCharToMultiByte(CP_UTF8, 0, str, wcslen(str), NULL, 0, NULL, NULL);
      char *str8 = (char *)malloc(size + 1);
      WideCharToMultiByte(CP_UTF8, 0, str, wcslen(str), str8, size, NULL, NULL);
      str8 = '\0';
      return str8;
#else
      return _strdup(str);
#endif
}
//将UNICODE字符串变换为窄字符串
void TcharToChar(const TCHAR *szTchar, char *szStr)
{
#ifdef _UNICODE
    int size = WideCharToMultiByte(CP_ACP, 0, szTchar, wcslen(szTchar), NULL, 0, NULL, NULL);
    char szTemp = { 0 };
    WideCharToMultiByte(CP_ACP, 0, szTchar, wcslen(szTchar), szTemp, size, NULL, NULL);
    strcpy(szStr, szTemp);
#else
      return _strdup(str); //报错str未定义
#endif
//#ifdef _UNICODE
//    int iLength;
//    //获取字节长度   
//    iLength = WideCharToMultiByte(CP_ACP, 0, szTchar, -1, NULL, 0, NULL, NULL);
//    //char szTemp = {0};
//    WideCharToMultiByte(CP_OEMCP, WC_COMPOSITECHECK, szTchar, -1, szStr, iLength, NULL, NULL);
//    //strcpy(szStr,szTemp);
//#else
//    _tcscpy(szStr, szTchar);
//#endif
}

void CharToTchar(const char *szStr, TCHAR *szTchar)
{
#ifdef _UNICODE
    int iLength;

    iLength = MultiByteToWideChar(CP_ACP, 0, szStr, strlen(szStr) + 1, NULL, 0);
    MultiByteToWideChar(CP_ACP, 0, szStr, strlen(szStr) + 1, szTchar, iLength);
#else
    _tcscpy(szTchar, szStr);
#endif
}

咬字分开念 发表于 2022-12-29 18:44

是不是应该


      return _strdup(strcpy(szStr, szTemp));

accor 发表于 2022-12-29 19:47

本帖最后由 accor 于 2022-12-29 19:48 编辑

str改成szTchar?

accor 发表于 2022-12-29 19:51

看源码应该是支持unicode的话返回正常值,不支持的话返回原始的Tchar类型

tl;dr 发表于 2022-12-29 20:22

执_念 发表于 2022-12-29 20:37

本帖最后由 执_念 于 2022-12-29 20:38 编辑

strcpy(szStr, szTchar);

teety 发表于 2022-12-29 22:55

本帖最后由 teety 于 2022-12-29 22:57 编辑

char* Utf8ToGBK(const char* strUtf8)
{
      int len=MultiByteToWideChar(CP_UTF8, 0, (LPCTSTR)strUtf8, -1, NULL,0);
      unsigned short * wszGBK = new unsigned short;
      memset(wszGBK, 0, len * 2 + 2);
      MultiByteToWideChar(CP_UTF8, 0, (LPCTSTR)strUtf8, -1, (LPWSTR)wszGBK, len);
      len = WideCharToMultiByte(CP_ACP, 0, (LPWSTR)wszGBK, -1, NULL, 0, NULL, NULL);
      char *szGBK=new char;
      memset(szGBK, 0, len + 1);
      WideCharToMultiByte (CP_ACP, 0, (LPWSTR)wszGBK, -1, szGBK, len, NULL,NULL);
      return szGBK;
}

char* GBKToUtf8(const char* strGBK)
{
      int len=MultiByteToWideChar(CP_ACP, 0, (LPCTSTR)strGBK, -1, NULL,0);
      unsigned short * wszUtf8 = new unsigned short;
      memset(wszUtf8, 0, len * 2 + 2);
      MultiByteToWideChar(CP_ACP, 0, (LPCTSTR)strGBK, -1, (LPWSTR)wszUtf8, len);
      len = WideCharToMultiByte(CP_UTF8, 0, (LPWSTR)wszUtf8, -1, NULL, 0, NULL, NULL);
      char *szUtf8=new char;
      memset(szUtf8, 0, len + 1);
      WideCharToMultiByte (CP_UTF8, 0, (LPWSTR)wszUtf8, -1, szUtf8, len, NULL,NULL);
      return szUtf8;
}

爱飞的猫 发表于 2022-12-30 02:05

要自己处理/猜测文件名编码,因为 zip 标准没有定义文件名的编码。
有的程序是当前系统的编码,有些是 UTF-8

wanglong001 发表于 2022-12-30 10:57

谢谢大佬的分享

ibilibili 发表于 2022-12-30 18:03

解压怎么会出现中文乱码。
肯定你你编辑器的设置问题。编辑器改成utf8编码试试。
页: [1]
查看完整版本: C++求解6