(C++)UrlEncode的标准实现 libcul
2015-11-27 11:42
591 查看
/article/3726255.html
libcul post 中文/特殊字符 url 连接时,需要转编码 ==
关于UrlEncode的实现(C++),网上有很多不同的版本,对需要编码的字符集的选取并不统一。那么到底有没有标准呢?答案是有的,参见wiki
绝对不编码的,只有字母、数字、短横线(-)、下划线(_)、点(.)和波浪号(~),其他字符要视情况而定,所以一般性的urlencode只需保留上述字符不进行编码。
下面给出实现:
这个函数可以直接用:
std::string UrlEncode(const std::string& str)
libcul 本身,内部提供转编码函数 :char *curl_escape(const char
*string, int length)
libcul post 中文/特殊字符 url 连接时,需要转编码 ==
关于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; }
这个函数可以直接用:
std::string UrlEncode(const std::string& str)
libcul 本身,内部提供转编码函数 :char *curl_escape(const char
*string, int length)
int CHttpClient::Posts(const std::string & strUrl, const std::string & strPost, std::string & strResponse, const char * pCaPath) { CURLcode res; CURL* curl = curl_easy_init(); if (NULL == curl) { return CURLE_FAILED_INIT; } if (m_bDebug) { curl_easy_setopt(curl, CURLOPT_VERBOSE, 1); curl_easy_setopt(curl, CURLOPT_DEBUGFUNCTION, OnDebug); } curl_slist *http_headers = NULL; CString strHead; CString strVersion = UTOUULoginManager->m_version.c_str(); strHead.Format(_T("User-app:demo/%s"), strVersion); string head = nbase::UTF16ToUTF8(strHead.GetBuffer(0)); http_headers = curl_slist_append(http_headers, head.c_str()); curl_easy_setopt(curl, CURLOPT_HTTPHEADER, http_headers); curl_easy_setopt(curl, CURLOPT_URL, strUrl.c_str()); curl_easy_setopt(curl, CURLOPT_POST, 1); string str = curl_escape(strPost.c_str(), strPost.length()); string str2 = UrlEncode(strPost.c_str()); curl_easy_setopt(curl, CURLOPT_POSTFIELDS, str); curl_easy_setopt(curl, CURLOPT_READFUNCTION, NULL); curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, OnWriteData); curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&strResponse); curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1); if (NULL == pCaPath) { curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, false); curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, false); } else { //缺省情况就是PEM,所以无需设置,另外支持DER //curl_easy_setopt(curl,CURLOPT_SSLCERTTYPE,"PEM"); curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, true); curl_easy_setopt(curl, CURLOPT_CAINFO, pCaPath); } curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, 3); curl_easy_setopt(curl, CURLOPT_TIMEOUT, 3); res = curl_easy_perform(curl); curl_easy_cleanup(curl); return res == CURLE_OK; }
相关文章推荐
- [019]转--C++ operator关键字(重载操作符)
- OpenCV 2.4+ C++ SVM线性不可分处理
- OpenCV 2.4+ C++ SVM介绍
- C++ 全排列函数 std::next_permutation与std::prev_permutation
- C/C++——多态性和虚函数
- C++贪吃蛇——(2)
- C++ 类 实现栈
- C++贪吃蛇——(1)
- C++容器的拷贝注意细节
- C语言string家族函数使用说明及范例
- #if defined和#if !defined(c语言的宏定义)
- c++对ip和端口的处理
- 33.c/c++程序员面试宝典-函数重载
- 转: windows下C++ UI库 UI神器-SOUI
- C++中delete和delete[]的区别
- 汇编语言中的常数
- 二叉树遍历之递归实现(C++版)
- c语言编写一段小程序,出现了复制某个文件到一个找不到的路径里边
- 第10周项目3 利用二叉树遍历思想解决问题
- 第10周项目2 二叉树遍历的递归算法