#include<iostream>
#include<stdio.h>
#include<cstring>
using namespace std;
const char hexchars[] = "0123456789abcdef";
const char HEXCHARS[] = "0123456789ABCDEF";
int PHPhtoi(char *pszStr)
{
int iValue;
int iChar;
iChar = ((unsigned char *)pszStr)[0];
if (isupper(iChar))
iChar = tolower(iChar);
iValue = (iChar >= '0' && iChar <= '9' ? iChar - '0' : iChar - 'a' + 10) * 16;
iChar = ((unsigned char *)pszStr)[1];
if (isupper(iChar))
iChar = tolower(iChar);
iValue += iChar >= '0' && iChar <= '9' ? iChar - '0' : iChar - 'a' + 10;
return (iValue);
}
char * PHPUrlEncode(const char *pszBuff , int iLen , int* piNewLength)
{
register unsigned char uChar;
unsigned char *pszTo, *pszStart;
unsigned char const *pszFrom, *pszEnd;
pszFrom = (unsigned char *)pszBuff;
pszEnd = (unsigned char *)pszBuff + iLen;
pszStart = pszTo = new unsigned char[3*iLen+1];
while (pszFrom < pszEnd) {
uChar = *pszFrom++;
if (uChar == ' ') {
*pszTo++ = '+';
}
else if ((uChar < '0' && uChar != '-' && uChar != '.') ||
(uChar < 'A' && uChar > '9') ||
(uChar > 'Z' && uChar < 'a' && uChar != '_') ||
(uChar > 'z')) {
pszTo[0] = '%';
pszTo[1] = HEXCHARS[uChar >> 4];
pszTo[2] = HEXCHARS[uChar & 15];
pszTo += 3;
}
else {
*pszTo++ = uChar;
}
}
*pszTo = 0;
if (piNewLength) {
*piNewLength = pszTo - pszStart;
}
return (char *) pszStart;
}
int PHPUrlDecode(char *pszStr)
{
int iLen;
char *pszDest = pszStr;
char *pszData = pszStr;
iLen=strlen(pszStr);
while (iLen--)
{
if (*pszData == '+')
{
*pszDest = ' ';
}
else if (*pszData == '%' && iLen >= 2
&& isxdigit((int) *(pszData + 1))
&& isxdigit((int) *(pszData + 2)))
{
*pszDest = (char) PHPhtoi(pszData + 1);
pszData += 2;
iLen -= 2;
}
else
{
*pszDest = *pszData;
}
pszData++;
pszDest++;
}
*pszDest = '\0';
return pszDest - pszStr;
}
int main()
{
char a[] = "wolike%1测试";
PHPUrlDecode(a);
int blen = 0;
char *b = PHPUrlEncode(a, strlen(a), &blen);
cout << b << " " << blen << endl;
}