-------------------------------------------欢迎查看字符编码【专栏】------------------------------------------
汉字编码之GBK编码【点击】 判断汉字正则表达式更严谨方法【点击】
记事本输入“联通”俩字,关闭再打开乱码 【点击】 iPhone emoji问题牵出的Unicode代理区的思考【点击】
Unicdoe【真正的完整码表】对照表【点击】 开源工程ZipArchive,压缩中文文件名乱码问题【点击】
base64加密,解密,encode,decode,编码详解+实现【点击】
网络传输文本,urlEncode和urldecode的iOS实现【点击】 字符编码的奥秘utf-8, Unicode【点击】
----------------------------------------------------------------------------------------------------------------
url Encode和Decode的实现
源码下载地址(vs2005版本):http://download.csdn.net/detail/hherima/5108862
也可以下载源码(ios版本):http://download.csdn.net/detail/hherima/5108862
根据RFC 3986 section 2.2 保留字符 (2005年1月)下面18个字符需要urlencode
!*'();:@&=+$,/?#[]
更详细哪些字符是需要转化的呢:
1. ASCII 的控制字符
这些字符都是不可打印的,自然需要进行转化。
2. 一些非ASCII字符
这些字符自然是非法的字符范围。转化也是理所当然的了。
3. 一些保留字符
很明显最常见的就是“&”了,这个如果出现在url中了,那你认为是url中的一个字符呢,还是特殊的参数分割用的呢?
4. 就是一些不安全的字符了
Http协议中参数的传输是"key=value"这种简直对形式的,如果要传多个参数就需要用“&”符号对键值对进行分割。如"?name1=value1&name2=value2"
如果我的参数值中就包含=或&这种特殊字符的时候该怎么办?这时候就要用到urlEncode/Decode。
下面是IOS的源码,注意将源文件后缀改为mm相关的VC后缀也改为mm
头文件
using namespace std;
#include <string.h>
#include <iostream>
class UrlEncode
{
public:
NSString* Encode(NSString*src);
NSString* Decode(NSString* src);
private:
string HttpUrlDecode(const string& srcUrl);
string HttpUrlEncode(const string& srcUrl);
int hexchar2int(char c);
string UrlEncodeFormat(const unsigned char cValue);
string DecimalToHexString(unsigned int nValue);
};
源文件
#include "UrlEncode.h"
NSString* UrlEncode::Encode(NSString*src)
{
string buf = HttpUrlEncode([src UTF8String]);
return [NSString stringWithUTF8String:buf.c_str()];
}
//
NSString* UrlEncode::Decode(NSString* src)
{
string buf = HttpUrlDecode([src UTF8String]);
return [NSString stringWithUTF8String:buf.c_str()];
}
//
string UrlEncode::HttpUrlDecode(const string& srcUrl)
{
string desStr;
int length = 0;
int flag =1;
unsigned char firstNum = 0;
unsigned char SecondNum = 0;
const char * pchar = srcUrl.c_str();//.Ptr();
while(length < srcUrl.length())
{
if(pchar[length]=='%')//&& length < srcUrl.length()-2
{
//最后一位,need break;
if(length == srcUrl.length()-1)
{
desStr +=pchar[length];//.append(pchar[length]);
break;
}
//正常移位
length++; firstNum = hexchar2int(pchar[length]);
length++; SecondNum = hexchar2int(pchar[length]);
if (firstNum == -1 || SecondNum == -1)//判断字符转换成的整数是否有效
{
flag = 0;
break;
}
desStr += char(firstNum<<4) + char(SecondNum);//.append(char(firstNum<<4) + char(SecondNum));
}
else if(pchar[length]=='+')
{
desStr +=' ';//.append(' ');//spaceb
}
//不是特殊字符的urlcode了,即英文字符,直接append到string即可
else
{
desStr +=pchar[length];// .append(pchar[length]);
}
length ++;
}
if(flag == 0)
{
return srcUrl;
}
return desStr;
}
//
string UrlEncode::HttpUrlEncode(const string& srcUrl)
{
string encodedUrl="";
int length = srcUrl.length();
if (length == 0)
{
return encodedUrl;
}
string sDontEncode = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_~.";//
// Parse a the chars in the url
for (int i=0; i<length; i++)
{
char cToFind = srcUrl.at(i);
if (-1 == sDontEncode.find(cToFind,0))
{
// Char not found encode it.
string tmp = UrlEncodeFormat(cToFind);
encodedUrl.append(tmp);
}
else if(cToFind == ' ')
{
encodedUrl += '+';//.append('+');
}
else
{
encodedUrl += cToFind;//.append(&cToFind,1);
}
}
return encodedUrl;
}
//
string UrlEncode::UrlEncodeFormat(const unsigned char cValue)
{
string tmp;
tmp.append("%");
unsigned int nDiv = cValue/16;
unsigned int nMod = cValue%16;
tmp.append(DecimalToHexString(nDiv));
tmp.append(DecimalToHexString(nMod));
return tmp;
}
//
string UrlEncode::DecimalToHexString(unsigned int nValue)
{
string tmp;
if(nValue<10)
tmp+= ((char)nValue +48);//append((int)nValue);
else
{
switch(nValue)
{
case 10:tmp.append("A");break;
case 11:tmp.append("B");break;
case 12:tmp.append("C");break;
case 13:tmp.append("D");break;
case 14:tmp.append("E");break;
case 15:tmp.append("F");break;
default:break;
}
}
return tmp;
}
/**
*将hex字符转换成对应的整数
*return 0~15:转换成功,-1:表示c 不是 hexchar
*/
int UrlEncode::hexchar2int(char c)
{
if (c >= '0' && c <= '9')
return c - '0';
else if (c >= 'a' && c <= 'f')
return c - 'a' + 10;
else if (c >= 'A' && c <= 'F')
return c - 'A' + 10;
else
return -1;
}