(C++)UrlEncode的標准實現


http://blog.163.com/xiaopengyan_109/blog/static/149832173201072685539394/

地址欄傳中文參數后是什么編碼格式

 

網頁中的表單使用POST方法提交時,數據內容的類型是 application/x-www-form-urlencoded,這種類型會:

  1.字符"a"-"z","A"-"Z","0"-"9",".","-","*",和"_" 都不會被編碼;

  2.將空格轉換為加號 (+) ;

  3.將非文本內容轉換成"%xy"的形式,xy是兩位16進制的數值;

  4.在每個 name=value 對之間放置 & 符號。

  */

  URLEncoder類包含將字符串轉換為application/x-www-form-urlencoded MIME 格式的靜態方法。

   web設計者面臨的眾多難題之一便是怎樣處理不同操作系統間的差異性。這些差異性能引起URL方面的問題:例如,一些操作系統允許文件名中含有空格符, 有些又不允許。大多數操作系統不會認為文件名中含有符號“#”會有什么特殊含義;但是在一個URL中,符號“#”表示該文件名已經結束,后面會緊跟一個 fragment(部分)標識符。其他的特殊字符,非字母數字字符集,它們在URL或另一個操作系統上都有其特殊的含義,表述着相似的問題。為了解決這些 問題,我們在URL中使用的字符就必須是一個ASCII字符集的固定字集中的元素,具體如下:

  1.大寫字母A-Z

  2.小寫字母a-z

  3.數字 0-9

  4.標點符 - _ . ! ~ * ' (和 ,)

  諸如字符: / & ? @ # ; $ + = 和 %也可以被使用,但是它們各有其特殊的用途,如果一個文件名包括了這些字符( / & ? @ # ; $ + = %),這些字符和所有其他字符就應該被編碼。

   編碼過程非常簡單,任何字符只要不是ASCII碼數字,字母,或者前面提到的標點符,它們都將被轉換成字節形式,每個字節都寫成這種形式:一個“%”后 面跟着兩位16進制的數值。空格是一個特殊情況,因為它們太平常了。它除了被編碼成“%20”以外,還能編碼為一個“+”。加號(+)本身被編碼 為%2B。當/ # = & 和?作為名字的一部分來使用時,而不是作為URL部分之間的分隔符來使用時,它們都應該被編碼。

 

 

 

 

 

 

http://m.blog.csdn.net/blog/gemo/8468311

  關於UrlEncode的實現(C++),網上有很多不同的版本,對需要編碼的字符集的選取並不統一。那么到底有沒有標准呢?答案是有的,參見wiki

    絕對不編碼的,只有字母、數字、短橫線(-)、下划線(_)、點(.)和波浪號(~),其他字符要視情況而定,所以一般性的urlencode只需保留上述字符不進行編碼。

    下面給出實現:


unsigned char ToHex(unsigned char x) 
{ 
    return  x > 9 ? x + 55 : x + 48; 
}

unsigned char FromHex(unsigned char x) 
{ 
    unsigned char y;
    if (x >= 'A' && x <= 'Z') y = x - 'A' + 10;
    else if (x >= 'a' && x <= 'z') y = x - 'a' + 10;
    else if (x >= '0' && x <= '9') y = x - '0';
    else assert(0);
    return y;
}

std::string UrlEncode(const std::string& str)
{
    std::string strTemp = "";
    size_t length = str.length();
    for (size_t i = 0; i < length; i++)
    {
        if (isalnum((unsigned char)str[i]) || 
            (str[i] == '-') ||
            (str[i] == '_') || 
            (str[i] == '.') || 
            (str[i] == '~'))
            strTemp += str[i];
        else if (str[i] == ' ')
            strTemp += "+";
        else
        {
            strTemp += '%';
            strTemp += ToHex((unsigned char)str[i] >> 4);
            strTemp += ToHex((unsigned char)str[i] % 16);
        }
    }
    return strTemp;
}

std::string UrlDecode(const std::string& str)
{
    std::string strTemp = "";
    size_t length = str.length();
    for (size_t i = 0; i < length; i++)
    {
        if (str[i] == '+') strTemp += ' ';
        else if (str[i] == '%')
        {
            assert(i + 2 < length);
            unsigned char high = FromHex((unsigned char)str[++i]);
            unsigned char low = FromHex((unsigned char)str[++i]);
            strTemp += high*16 + low;
        }
        else strTemp += str[i];
    }
    return strTemp;
}




C/C++版實現(Base64, UrlEncode等)
http://www.cnblogs.com/hoodlum1980/archive/2012/05/28/2521500.html












免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM