主要内容转载自: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/
posted on 2017-11-13 20:11  HDU李少帅  阅读(272)  评论(0编辑  收藏  举报