主要内容转载自:http://blog.163.com/zhangjie_0303/blog/static/9908270620148251658993/
今天在调的时候同事发过来包里包含汉字,我tcpdump出来全显示包体是89%E6%B1%89%E6%B1%89%E6%B1%89的东西,服务器期望的是收到utf8编码,而安卓发过来的是这样的编码,之后问了下朋友知道这个是URL编码格式,了解了如果是utf8字段,会在每个字节前加上%而得到,为了验证,在网上找了个C++版本的URLDecode和URLEncode,对安卓发过来的包体URLDecode后,编码就正确了。
#include <iostream>
#include <stdlib.h>
#include <string.h>
using namespace std;
typedef unsigned char BYTE;
inline BYTE toHex(const BYTE &x)
{
return x > 9 ? x -10 + 'A': x + '0';
}
inline BYTE fromHex(const BYTE &x)
{
return isdigit(x) ? x-'0' : x-'A'+10;
}
inline string URLEncode(const string &sIn)
{
string sOut;
for( size_t ix = 0; ix < sIn.size(); ix++ )
{
BYTE buf[4];
memset( buf, 0, 4 );
if( isalnum( (BYTE)sIn[ix] ) )
{
buf[0] = sIn[ix];
}
//else if ( isspace( (BYTE)sIn[ix] ) ) //貌似把空格编码成%20或者+都可以
//{
// buf[0] = '+';
//}
else
{
buf[0] = '%';
buf[1] = toHex( (BYTE)sIn[ix] >> 4 );
buf[2] = toHex( (BYTE)sIn[ix] % 16);
}
sOut += (char *)buf;
}
return sOut;
};
inline string URLDecode(const string &sIn)
{
string sOut;
for( size_t ix = 0; ix < sIn.size(); ix++ )
{
BYTE ch = 0;
if(sIn[ix]=='%')
{
ch = (fromHex(sIn[ix+1])<<4);
ch |= fromHex(sIn[ix+2]);
ix += 2;
}
else if(sIn[ix] == '+')
{
ch = ' ';
}
else
{
ch = sIn[ix];
}
sOut += (char)ch;
}
return sOut;
}
/*int main(int argc, char** argv)
{
string test_str1 = "老同学";
//string test_str2 = URLEncode(test_str1);
string test_str2 = "%89%E6%B1%89%E6%B1%89";
cout << "test_str2=" << test_str2 <<endl;
string test_str3 = URLDecode(test_str2);
cout << "test_str3=" << test_str3 <<endl;
return 0;
}*/
参考:
// http://blog.csdn.net/sandro_zhang/article/details/7616588
// http://www.2cto.com/kf/201301/185444.html
// http://wujianpingnono.blog.163.com/blog/static/82427168201172344336279/
---------------------------我的天空里没有太阳,总是黑夜,但并不暗,因为有东西代替了太阳。虽然没有太阳那么明亮,但对我来说已经足够。凭借着这份光,我便能把黑夜当成白天。我从来就没有太阳,所以不怕失去。
--------《白夜行》