zoukankan      html  css  js  c++  java
  • UTF-8到GBK转换

    实际就是由宽字节转换为多字节的过程

    -------------

    首先MultiByteToWideChar(CP_UTF8, 0, (LPCSTR)szOut, -1, (LPWSTR)wszGBK, len) 转换UTF-8 到表中UNICODE

    然后

    WideCharToMultiByte(CP_ACP, 0, (LPWSTR)wszGBK, -1, szGBK, len, NULL, NULL); UNICODE转换为标准多字节

    这个时候已经是ANSI格式了,事实上不是GBK格式,可是一般这个时候编译器和操作系统字符集就能去解决下边的事了。就是说能够直接当普通的char *来用了

    ---------------

    void UTF8ToGBK( char *&szOut )
    {
      unsigned short *wszGBK;
      char *szGBK;
      //长度
      int len = MultiByteToWideChar(CP_UTF8, 0, (LPCSTR)szOut, -1, NULL, 0);
      wszGBK = new unsigned short[len+1];
      memset(wszGBK, 0, len * 2 + 2);
      MultiByteToWideChar(CP_UTF8, 0, (LPCSTR)szOut, -1, (LPWSTR)wszGBK, len);


      //长度
      len = WideCharToMultiByte(CP_ACP, 0, (LPWSTR)wszGBK, -1, NULL, 0, NULL, NULL);
      szGBK = new char[len+1];
      memset(szGBK, 0, len + 1);
      WideCharToMultiByte(CP_ACP, 0, (LPWSTR)wszGBK, -1, szGBK, len, NULL, NULL);


      //szOut = szGBK; //这样得到的szOut不对,由于此句意义是将szGBK的首地址赋给szOut。当delete []szGBK运行后szGBK的内


      //存空间将被释放。此时将得不到szOut的内容


      memset(szOut,'0',strlen(szGBK)+1); //改将szGBK的内容赋给szOut ,这样即使szGBK被释放也能得到正确的值
      memcpy(szOut,szGBK,strlen(szGBK)+1);//最后这个+1不要忘了




      delete []szGBK;
      delete []wszGBK;
    }

  • 相关阅读:
    第1次作业
    第0次作业
    总结报告
    第14、15周作业
    第七周作业
    第六周作业
    第四周作业
    第四次作业
    第三次作业
    2018第二次作业
  • 原文地址:https://www.cnblogs.com/wgwyanfs/p/6971166.html
Copyright © 2011-2022 走看看