-
URL을 UTF8 방식으로 Encoding/Decoding 하기...공장 이야기 2014. 4. 23. 17:22
소스 나갑니다.
------------------------------------------------------------------------------------------------
.h
class UTF8ForURL
{
public:
UTF8ForURL(void);
virtual ~UTF8ForURL(void);
WCHAR* EncodeToUTF8(WCHAR* szSource);
WCHAR* DecodeFromUTF8(WCHAR* szSource);
};
BYTE makeByte(WCHAR ch1, WCHAR ch2);
------------------------------------------------------------------------------------------------
.cpp
BYTE makeByte(WCHAR ch1, WCHAR ch2)
{
BYTE bt1 = 0, bt2 = 0;
switch(ch2)
{
case L'0':
bt2 = 0x00;
break;
case L'1':
bt2 = 0x01;
break;
case L'2':
bt2 = 0x02;
break;
case L'3':
bt2 = 0x03;
break;
case L'4':
bt2 = 0x04;
break;
case L'5':
bt2 = 0x05;
break;
case L'6':
bt2 = 0x06;
break;
case L'7':
bt2 = 0x07;
break;
case L'8':
bt2 = 0x08;
break;
case L'9':
bt2 = 0x09;
break;
case L'A':
bt2 = 0x0A;
break;
case L'B':
bt2 = 0x0B;
break;
case L'C':
bt2 = 0x0C;
break;
case L'D':
bt2 = 0x0D;
break;
case L'E':
bt2 = 0x0E;
break;
case L'F':
bt2 = 0x0F;
break;
}
switch (ch1)
{
case L'0':
bt1 = 0x00;
break;
case L'1':
bt1 = 0x10;
break;
case L'2':
bt1 = 0x20;
break;
case L'3':
bt1 = 0x30;
break;
case L'4':
bt1 = 0x40;
break;
case L'5':
bt1 = 0x50;
break;
case L'6':
bt1 = 0x60;
break;
case L'7':
bt1 = 0x70;
break;
case L'8':
bt1 = 0x80;
break;
case L'9':
bt1 = 0x90;
break;
case L'A':
bt1 = 0xA0;
break;
case L'B':
bt1 = 0xB0;
break;
case L'C':
bt1 = 0xC0;
break;
case L'D':
bt1 = 0xD0;
break;
case L'E':
bt1 = 0xE0;
break;
case L'F':
bt1 = 0xF0;
break;
}
BYTE btFinal = bt2 | bt1;
return btFinal;
}
UTF8ForURL::UTF8ForURL(void)
{
}
UTF8ForURL::~UTF8ForURL(void)
{
}
WCHAR* UTF8ForURL::EncodeToUTF8(WCHAR* szSource)
{
WORD ch;
BYTE bt1, bt2, bt3, bt4, bt5, bt6;
size_t nLoop, nMax = wcslen(szSource);
int nEncodePos = 0;
WCHAR pszTemp[19] = { 0, };
WCHAR* pszFinal = 0;
pszFinal = (WCHAR *)::malloc(((nMax*18)+1)*sizeof(WCHAR));
if(0 == pszFinal)
return 0;
::memset(pszFinal, 0, ((nMax*18)+1)*sizeof(WCHAR));
for(nLoop=0; nLoop<nMax; ++nLoop)
{
ch = (WORD)szSource[nLoop];
if(ch == L'%%')
{
::memset(pszTemp, 0, 19);
wsprintfW(pszTemp, L"%%%02X", ch);
::memcpy(&pszFinal[nEncodePos], pszTemp, 3*sizeof(WCHAR));
nEncodePos = nEncodePos + 3;
}
else if(ch < 128)
{
pszFinal[nEncodePos] = szSource[nLoop];
nEncodePos = nEncodePos + 1;
}
else if(ch <= 2047)
{
::memset(pszTemp, 0, 19);
bt1 = (BYTE)(192 + (ch / 64));
bt2 = (BYTE)(128 + (ch % 64));
wsprintfW(pszTemp, L"%%%02X%%%02X", bt1, bt2);
::memcpy(&pszFinal[nEncodePos], pszTemp, 6*sizeof(WCHAR));
nEncodePos = nEncodePos + 6;
}
else if(ch <= 65535)
{
::memset(pszTemp, 0, 19);
bt1 = (BYTE)(224 + (ch / 4096));
bt2 = (BYTE)(128 + ((ch / 64) % 64));
bt3 = (BYTE)(128 + (ch % 64));
wsprintfW(pszTemp, L"%%%02X%%%02X%%%02X", bt1, bt2, bt3);
::memcpy(&pszFinal[nEncodePos], pszTemp, 9*sizeof(WCHAR));
nEncodePos = nEncodePos + 9;
}
else if(ch <= 2097151)
{
::memset(pszTemp, 0, 19);
bt1 = (BYTE)(240 + (ch / 262144));
bt2 = (BYTE)(128 + ((ch / 4096) % 64));
bt3 = (BYTE)(128 + ((ch / 64) % 64));
bt4 = (BYTE)(128 + (ch % 64));
wsprintfW(pszTemp, L"%%%02X%%%02X%%%02X%%%02X", bt1, bt2, bt3, bt4);
::memcpy(&pszFinal[nEncodePos], pszTemp, 12*sizeof(WCHAR));
nEncodePos = nEncodePos + 12;
}
else if(ch <=67108863)
{
::memset(pszTemp, 0, 19);
bt1 = (BYTE)(248 + (ch / 16777216));
bt2 = (BYTE)(128 + ((ch / 262144) % 64));
bt3 = (BYTE)(128 + ((ch / 4096) % 64));
bt4 = (BYTE)(128 + ((ch / 64) % 64));
bt5 = (BYTE)(128 + (ch % 64));
wsprintfW(pszTemp, L"%%%02X%%%02X%%%02X%%%02X%%%02X", bt1, bt2, bt3, bt4, bt5);
::memcpy(&pszFinal[nEncodePos], pszTemp, 15*sizeof(WCHAR));
nEncodePos = nEncodePos + 15;
}
else if(ch <=2147483647)
{
::memset(pszTemp, 0, 19);
bt1 = (BYTE)(252 + (ch / 1073741824));
bt2 = (BYTE)(128 + ((ch / 16777216) % 64));
bt3 = (BYTE)(128 + ((ch / 262144) % 64));
bt4 = (BYTE)(128 + ((ch / 4096) % 64));
bt5 = (BYTE)(128 + ((ch / 64) % 64));
bt6 = (BYTE)(128 + (ch % 64));
wsprintfW(pszTemp, L"%%%02X%%%02X%%%02X%%%02X%%%02X%%%02X", bt1, bt2, bt3, bt4, bt5, bt6);
::memcpy(&pszFinal[nEncodePos], pszTemp, 18*sizeof(WCHAR));
nEncodePos = nEncodePos + 18;
}
}
return pszFinal;
}
WCHAR* UTF8ForURL::DecodeFromUTF8(WCHAR* szSource)
{
size_t nLoop, nMax = wcslen(szSource);
WORD ch;
BYTE z, y, x, w, v, u;
WCHAR pszTemp[19] = { 0, };
WCHAR* pszFinal = 0;
int nDecodePos = 0;
pszFinal = (WCHAR *)::malloc((nMax+1)*sizeof(WCHAR));
if(0 == pszFinal)
return 0;
::memset(pszFinal, 0, (nMax+1)*sizeof(WCHAR));
for (nLoop=0; nLoop<nMax; ++nLoop)
{
ch = (WORD)szSource[nLoop];
if(ch != L'%%')
{
pszFinal[nDecodePos] = (WCHAR)ch;
goto endPoint;
}
if (nLoop >= nMax - 2)
break; // something is wrong
z = makeByte(szSource[nLoop+1], szSource[nLoop+2]);
if(z < 127)
{
pszFinal[nDecodePos] = (WCHAR)z;
nLoop = nLoop + 2;
}
else if(z >= 192 && z <= 223)
{
// character is two bytes
if (nLoop >= nMax - 5)
break; // something is wrong
y = makeByte(szSource[nLoop+4], szSource[nLoop+5]);
pszFinal[nDecodePos] = (WCHAR)( (z-192)*64 + (y-128) );
nLoop = nLoop + 5;
}
else if(z >= 224 && z <= 239)
{
// character is three bytes
if (nLoop >= nMax - 8)
break; // something is wrong
y = makeByte(szSource[nLoop+4], szSource[nLoop+5]);
x = makeByte(szSource[nLoop+7], szSource[nLoop+8]);
pszFinal[nDecodePos] = (WCHAR)( (z-224)*4096 + (y-128)*64 + (x-128) );
nLoop = nLoop + 8;
}
else if(z >= 240 && z <= 247)
{
// character is four bytes
if (nLoop >= nMax - 11)
break; // something is wrong
y = makeByte(szSource[nLoop+4], szSource[nLoop+5]);
x = makeByte(szSource[nLoop+7], szSource[nLoop+8]);
w = makeByte(szSource[nLoop+10], szSource[nLoop+11]);
pszFinal[nDecodePos] = (WCHAR)( (z-240)*262144 + (y-128)*4096 + (x-128)*64 + (w-128) );
nLoop = nLoop + 11;
}
else if(z >= 248 && z <= 251)
{
// character is four bytes
if (nLoop >= nMax - 14)
break; // something is wrong
y = makeByte(szSource[nLoop+4], szSource[nLoop+5]);
x = makeByte(szSource[nLoop+7], szSource[nLoop+8]);
w = makeByte(szSource[nLoop+10], szSource[nLoop+11]);
v = makeByte(szSource[nLoop+13], szSource[nLoop+14]);
pszFinal[nDecodePos] = (WCHAR)( (z-248)*16777216 + (y-128)*262144 + (x-128)*4096 + (w-128)*64 + (v-128) );
nLoop = nLoop + 14;
}
else if(z >= 252 && z <= 253)
{
// character is four bytes
if (nLoop >= nMax - 17)
break; // something is wrong
y = makeByte(szSource[nLoop+4], szSource[nLoop+5]);
x = makeByte(szSource[nLoop+7], szSource[nLoop+8]);
w = makeByte(szSource[nLoop+10], szSource[nLoop+11]);
v = makeByte(szSource[nLoop+13], szSource[nLoop+14]);
u = makeByte(szSource[nLoop+16], szSource[nLoop+17]);
pszFinal[nDecodePos] = (WCHAR)( (z-252)*1073741824 + (y-128)*16777216 + (x-128)*262144 + (w-128)*4096 + (v-128)*64 + (u-128) );
nLoop = nLoop + 17;
}
endPoint:
nDecodePos++;
}
return pszFinal;
}
'공장 이야기' 카테고리의 다른 글
Node.JS 설정 변경 시 (0) 2015.08.11 webkit Visual Studio 빌드 시 오류. (0) 2014.06.16 Webkit 해당 기능 ENABLE 시키기!!! (0) 2013.03.20 Webkit 빌드 시 언로드 가능 한 Project (0) 2012.11.16 Webkit bug!!! (0) 2012.10.25