C++ 寫的UrlEncode和UrlDecode實(shí)例
關(guān)于UrlEncode的實(shí)現(xiàn)(C++)。網(wǎng)上有非常多不同的版本號(hào)。對(duì)須要編碼的字符集的選取并不統(tǒng)一。那么究竟有沒有標(biāo)準(zhǔn)呢?答案是有的。
絕對(duì)不編碼的,僅僅有字母、數(shù)字、短橫線(-)、下劃線(_)、點(diǎn)(.)和波浪號(hào)(~),其它字符要視情況而定。所以一般性的urlencode僅僅需保留上述字符不進(jìn)行編碼。
以下給出實(shí)現(xiàn):
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; }
補(bǔ)充知識(shí):C++中URL解碼/編碼
我就廢話不多說了,大家還是直接看代碼吧~
#include <iostream> #include <string> using namespace std; char dec2hexChar(short int n) { if (0 <= n && n <= 9) { return char(short('0') + n); } else if (10 <= n && n <= 15) { return char(short('A') + n - 10); } else { return char(0); } } short int hexChar2dec(char c) { if ('0' <= c && c <= '9') { return short(c - '0'); } else if ('a' <= c && c <= 'f') { return (short(c - 'a') + 10); } else if ('A' <= c && c <= 'F') { return (short(c - 'A') + 10); } else { return -1; } } string escapeURL(const string& URL) { string result = ""; for (unsigned int i = 0; i < URL.length(); i++) { char c = URL[i]; if ( ('0' <= c && c <= '9') || ('a' <= c && c <= 'z') || ('A' <= c && c <= 'Z') || c == '/' || c == '.' ) { result += c; } else { int j = (short int)c; if (j < 0) { j += 256; } int i1, i0; i1 = j / 16; i0 = j - i1 * 16; result += '%'; result += dec2hexChar(i1); result += dec2hexChar(i0); } } return result; } string deescapeURL(const string& URL) { string result = ""; for (unsigned int i = 0; i < URL.length(); i++) { char c = URL[i]; if (c != '%') { result += c; } else { char c1 = URL[++i]; char c0 = URL[++i]; int num = 0; num += hexChar2dec(c1) * 16 + hexChar2dec(c0); result += char(num); } } return result; }
以上這篇C++ 寫的UrlEncode和UrlDecode實(shí)例就是小編分享給大家的全部內(nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
C語言實(shí)現(xiàn)去除字符串中空格的簡單實(shí)例
下面小編就為大家?guī)硪黄狢語言實(shí)現(xiàn)去除字符串中空格的簡單實(shí)例。小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-05-05C語言數(shù)據(jù)的存儲(chǔ)超詳細(xì)講解上篇
使用編程語言進(jìn)行編程時(shí),需要用到各種變量來存儲(chǔ)各種信息。變量保留的是它所存儲(chǔ)的值的內(nèi)存位置。這意味著,當(dāng)您創(chuàng)建一個(gè)變量時(shí),就會(huì)在內(nèi)存中保留一些空間。您可能需要存儲(chǔ)各種數(shù)據(jù)類型的信息,操作系統(tǒng)會(huì)根據(jù)變量的數(shù)據(jù)類型,來分配內(nèi)存和決定在保留內(nèi)存中存儲(chǔ)什么2022-04-04