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