中英文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;
}
时间: 2024-10-05 20:12:33

中英文url解码vc++源程序的相关文章

关于URL 解码, 编码

由于近期客户需要用到CA认证,此CA认证采用的是URL方式出传值 使用指定的编码对象将 URL 编码的字符串转换为已解码的字符串. 编码个人理解就是将某字符串以某种方式储存起来,而解码则以其编码格式得出正确的结果 一般编码关键字 Encoding 引入命名空间:System.Text url编码引入命名空间:   System.Web 程序集:System.Web(在 System.Web.dll 中) URL编码 名称 说明 返回值 实例 UrlEncode(Byte[] ) 将字节数组转换为

【好程序员笔记分享】——URL解码与编码

-iOS培训,iOS学习-------型技术博客.期待与您交流!------------ 1.url编码 ios中http请求遇到汉字的时候,需要转化成UTF-8,用到的方法是: NSString * encodingString = [urlString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; 2.url解码 请求后,返回的数据,如何显示的是这样的格式:://,此时需要我们进行UTF-8解码,用到的方法是

快速解码base64和utf-8的ASCII编码和URL解码

看论坛上总是有人发乱七八糟的文字,根本看不懂,用下面的方法解密一下. 只要有浏览器的开发者工具就行了. UTF-8解码 console.log("\u5475\u5475") URL解码(在ES6中被标记为Draft) unescape("%u5475%u5475") Base64解码 decodeURIComponent(escape(atob( "5ZG15ZG1=" ))); 使用函数: function utf8_to_b64( str

Python3 url解码与参数解析

在获取zk节点时,有些子节点名字直接就是编码后的url,就像下面这行一样: url='dubbo%3A%2F%2F10.4.5.3%3A20880%2Fcom.welab.authority.service.AuthorityService%3Fanyhost%3Dtrue%26application%3Dwelab-authority%26dubbo%3D2.5.7' 先需要把这个url里进行解码, 转成如下这种: dubbo://10.4.5.3:20880/com.welab.author

Nginx将utf8编码的url解码成\x的16进制格式导致无法匹配静态文件的问题处理

例如请求/touch/article/北京/full.html,到达nginx后变成/ /touch/article/%E5%8C%97%E4%BA%AC/full.html, Nginx静态文件配置: location ~* ^/touch/article/.*\.html$ { expires -1; root /home/htmlfile; charset UTF-8; if ( !-f $request_filename ){ proxy_pass http://client.api.c

URL解码(GBK/UTF8) C++算法

我们浏览的网页都会被不同的编码方式编码 例如 :“C++”  URL编码(GBK)为 “C%2B%2B” 那么,如何实现解码呢? 通过观察可得url编码的编码规则 1.数字和字母不进行编码. 2.其他符号编码方式为对应ascii码的2位16进制前面加上一个“%”. 例如 “+” 查表可知 对应的16进制数为2B ,所以,“+” 编码成了“%2B”. 程序思路: 定义一个char数组存放需要解码的数据,然后用指针遍历,如果碰到%号则对其后面的两位进行转码,然后指针后移3位.如果碰到数字和字母则输出

Python进行URL解码

import urllib rawurl=xxx url=urllib.unquote(rawurl) 所用模块:urllib 所用函数:urllib.unquote() 案例 import urllib rawurl = "%E6%B2%B3%E6%BA%90" url = urllib.unquote(rawurl) print url 输出 河源 问题扩展 urllib.unquote()目的是对url编码进行解码,与该函数对应的是编码函数urllib.quote() >&

c# 对Url 解码编码

/// <summary> /// 对Url进行编码 /// </summary> /// <param name="url">url</param> /// <param name="isUpper">编码字符是否转成大写,范例,"http://"转成"http%3A%2F%2F"</param> public static string UrlEnco

Java正确URL解码方式:URLDecoder.decode

//解码,为了解决中文乱码 String str = URLDecoder.decode(request.getParameter("orderJson"),"UTF-8");