程序裡需要通過URL傳遞參數,裡面如果有中文的話就變成?????,程序設置為多字節。
求一個可以用的 URL編碼例子
自己解決了 轉化例子
void UnicodeToUTF_8(char* pOut, WCHAR* pText)
{
// 注意 WCHAR高低字的順序,低字節在前,高字節在後
char* pchar = (char *)pText;
pOut[0] = (0xE0 | ((pchar[1] & 0xF0) >> 4));
pOut[1] = (0x80 | ((pchar[1] & 0x0F) << 2)) + ((pchar[0] & 0xC0) >> 6);
pOut[2] = (0x80 | (pchar[0] & 0x3F));
return;
}
void GB2312ToUTF_8(CString& pOut, char *pText, int pLen)
{
char buf[4];
memset(buf, 0, 4);
pOut.Empty();
int i = 0;
while (i < pLen)
{
//如果是英文直接復制就可以
if (pText[i] >= 0)
{
char asciistr[2] = { 0 };
asciistr[0] = (pText[i++]);
pOut.Append(asciistr);
}
else
{
WCHAR pbuffer;
Gb2312ToUnicode(&pbuffer, pText + i);
UnicodeToUTF_8(buf, &pbuffer);
pOut.Append(buf);
i += 2;
}
}
return;
}
void Gb2312ToUnicode(WCHAR* pOut, char *gbBuffer)
{
::MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, gbBuffer, 2, pOut, 1);
return;
}
CString UrlUTF8(char * str)
{
CString tt;
CString dd;
GB2312ToUTF_8(tt, str, (int)strlen(str));
size_t len = tt.GetLength();
for (size_t i = 0; i<len; i++)
{
if (isalnum((BYTE)tt.GetAt(i)))
{
char tempbuff[2] = { 0 };
sprintf(tempbuff, "%c", (BYTE)tt.GetAt(i));
dd.Append(tempbuff);
}
else if (isspace((BYTE)tt.GetAt(i)))
{
dd.Append("+");
}
else
{
char tempbuff[4];
sprintf(tempbuff, "%%%X%X", ((BYTE)tt.GetAt(i)) >> 4, ((BYTE)tt.GetAt(i)) % 16);
dd.Append(tempbuff);
}
}
return dd;
}