首页 > 代码库 > (C++)UrlEncode的标准实现
(C++)UrlEncode的标准实现
关于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++)UrlEncode的标准实现
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。