游戏技术文章

中英文url解码vc++源程序

时间:2016-12-20 19:10:36  作者:棋牌资源网  来源:棋牌资源网  查看:6875  评论:0
内容摘要:本文主要讨论中文url解码实现问题,没有详细讲解url编码,utf-8编码.想对编解码问题有更加详细的了解,请查阅相关资料url编码:实质字符ascii码的十六进制。只是稍微有些变动,需要在前面加上"%"。比如"\",它的ascii码是92...
本文主要讨论中文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;
}

标签:中英文url解码vc++源程序 

欢迎加入VIP,【VIP售价:只要288元永久VIP会员】畅享商业棋牌游戏程序下载,点击开通!

下载说明


☉本站所有源码和资源均由站长亲自测试-绝对保证都可以架设,运营!
☉如源码和资源有损坏或所有链接均不能下载,请告知管理员,

☉本站软件和源码大部分为站长独资,资源购买和收集,放心下载!

☉唯一站长QQ:1004003180  [人格担保-本站注重诚信!]

☉购买建议E-mail:1004003180@qq.com   源码收购 E-mail:1004003180@qq.com    

☉本站文件解压密码  【文章内都自带解压密码,每个密码不同!】


本站提供的所有源码,均来源站长提供,仅学习交流 浙ICP备09009969号

由此产生不良后果和法律责任与本站无关,如果侵犯了您的版权,请来信告知 1004003180@qq.com 将及时更正和删除! 

Copyright © 2008-2024 棋牌资源网,你身边的棋牌资源下载站    All Rights Reserved