zoukankan      html  css  js  c++  java
  • 中英文url解码vc++源程序

    本文主要讨论中文url解码实现问题,没有详细讲解url编码,utf-8编码.想对编解码问题有更加详细的了解,请查阅相关资料
    url编码:实质字符ascii码的十六进制。只是稍微有些变动,需要在前面加上"%"。比如"\",它的ascii码是92,92的十六进制是5c,所以"\"的url编码就是%5c。
    UTF-8 编码是UNICODE的一种变长字符编码,由Ken Thompson于1992年创建。现在已经标准化为RFC 3629。UTF-8用1到6个字节编码UNICODE字符。如果UNICODE字符由2个字节表示,则编码成UTF-8很可能需要3个字节,而如果UNICODE字符由4个字节表示,则编码成UTF-8可能需要6个字节。
    这里我们只需要知道utf-8对一个英文字符采用一个字节进行编码,对一个中文字符采用三个字节进行编码。现在对如下url编码进行解码实现。
    url编码:MFC%E8%8B%B1%E6%96%87%E6%89%8B%E5%86%8C.chm
    源代码在windows xp sp2 + vc++6.0测试通过(改进过的代码)。
    #include <afx.h>
    #include <iostream>
    void UTF8ToGB(CString& str);

    void ANSIToGB(char* str,int n)
    {
     ASSERT(str!=NULL); // 保证传进来的参数不能为NULL
     wchar_t szwchar = 0;
     CString  szResult,szhead = "", szend = "";
     CString szrst;
     char ch, hex[2] = "";
     int ix = 0;
     szResult = str;
     int imax = szResult.GetLength();
     int ih = szResult.Find("%", 0);
     int ie = szResult.ReverseFind('%');
     szhead = szResult.Left(ih);
     //szend = szResault.Right(imax - ie - 3);
     szResult = "";
     ix = ih;
     CString strTemp;
     bool bIsHaveUTF8 = false;
     while (ch = *(str + ix))
     {
      
      if (ch == '%')
      {
       hex[0] = *(str + ix + 1);
       hex[1] = *(str + ix + 2);
       sscanf(hex, "%x", &szwchar);
       szrst += szwchar;
       ix+=3;
                bIsHaveUTF8 = true;
      }
      else
      {
       if(bIsHaveUTF8)
       {
         UTF8ToGB(szrst);
         strTemp+=szrst;
         szrst="";
         bIsHaveUTF8 = false;
       }
       // 取出不必转换的字符
       strTemp += *(str + ix);
       ix++;
      }
     }
     
     szResult = szhead + strTemp;
     memset(str,0,n);
     strcpy(str,szResult);

    }

    void UTF8ToGB(CString& szstr)
    {
     WCHAR* strSrc;

     TCHAR* szRes;
     int i = MultiByteToWideChar(CP_UTF8, 0, szstr, -1, NULL, 0);
     strSrc = new WCHAR[i + 1];
     
    MultiByteToWideChar(CP_UTF8, 0, szstr, -1, strSrc, i);
     i = WideCharToMultiByte(CP_ACP, 0, strSrc, -1, NULL, 0, NULL, NULL);
     szRes = new TCHAR[i + 1];
     WideCharToMultiByte(CP_ACP, 0, strSrc, -1, szRes, i, NULL, NULL);
     szstr = szRes;
     delete[]strSrc;
     delete[]szRes;
    }

    int main(int argc, char* argv[])
    {
    //str = "%E6%96%B0%E5%BB%BA";
    char str[] = "MFC%E8%8B%B1%E6%96%87%E6%89%8B%E5%86%8C.chm";

    // 注意,这里传给ANSIToGB的第一个参数一定不能是个常量字符串,

    // 因为ANSIToGB内部还要从第一个参数将结果返回

    // 当然这些只是细节,不值得斤斤计较,大家可以修改成自己合适的,比如,解码后的结果可以通过其他参数传出....

    ANSIToGB(str,strlen(str)*sizeof(char));

    printf("结果是:%s\n", str);

    return 0;
    }

  • 相关阅读:
    Node.js 调用 restful webservice
    Node.js的集群功能以及在Express的配置
    Node.js 连接mySQL程序
    客户端连接Redis
    缓存的压力测试脚本
    搭建redis集群环境
    编译EXE文件的时候pcap编译不进去。 pyinstaller pcap pypcap 报错
    selenium(五)伪造浏览器
    selenium(四)操作cookie,伪造cookie
    selenium(三)浏览器操作
  • 原文地址:https://www.cnblogs.com/rainbowzc/p/2199116.html
Copyright © 2011-2022 走看看