关闭

字符串编码之间的转换(GB2312<->UTF8<->Unicode)及URLEncoding .

161人阅读 评论(0) 收藏 举报
分类:
LPWSTR GB2312ToUnicode(LPCSTR lpszInBuf)
{
	if(NULL == lpszInBuf)
	{
		return NULL;
	}
	WCHAR* pBuf = NULL;
	int nLen = MultiByteToWideChar(CP_ACP, 0, lpszInBuf, -1, pBuf, 0);
	pBuf = new WCHAR[nLen];
	memset(pBuf, 0, sizeof(WCHAR) * nLen);
	MultiByteToWideChar(CP_ACP, 0, lpszInBuf, -1, pBuf, nLen);
	return pBuf;
}

LPSTR UnicodeToGB2312(LPCWSTR lpszInBuf)
{
	if(NULL == lpszInBuf)
	{
		return NULL;
	}
	CHAR* pBuf = NULL;
	int nLen = WideCharToMultiByte(CP_ACP, 0, lpszInBuf, -1, pBuf, 0, NULL, NULL);
	pBuf = new CHAR[nLen];
	memset(pBuf, 0, sizeof(CHAR) * nLen);
	WideCharToMultiByte(CP_ACP, 0, lpszInBuf, -1, pBuf, nLen, NULL, NULL);
	return pBuf;
}

LPWSTR UTF8ToUnicode(LPCSTR lpszInBuf)
{
	if(NULL == lpszInBuf)
	{
		return NULL;
	}
	WCHAR* pBuf = NULL;
	int nLen = MultiByteToWideChar(CP_UTF8, 0, lpszInBuf, -1, pBuf, 0);
	pBuf = new WCHAR[nLen];
	memset(pBuf, 0, sizeof(WCHAR) * nLen);
	MultiByteToWideChar(CP_UTF8, 0, lpszInBuf, -1, pBuf, nLen);
	return pBuf;
}

LPSTR UnicodeToUTF8(LPCWSTR lpszInBuf)
{
	if(NULL == lpszInBuf)
	{
		return NULL;
	}
	CHAR* pBuf =NULL;
	int nLen = WideCharToMultiByte(CP_UTF8, 0, lpszInBuf, -1, pBuf, 0, NULL, NULL);
	pBuf = new CHAR[nLen];
	memset(pBuf, 0, sizeof(CHAR) * nLen);
	WideCharToMultiByte(CP_UTF8, 0, lpszInBuf, -1, pBuf, nLen, NULL, NULL);
	return pBuf;
}

LPSTR GB2312ToUTF8(LPCSTR lpszInBuf)
{
	if(NULL == lpszInBuf)
	{
		return NULL;
	}
	LPWSTR lpszTmp = GB2312ToUnicode(lpszInBuf);
	LPSTR lpszBuf = UnicodeToUTF8(lpszTmp);
	delete[] lpszTmp;
	lpszTmp = NULL;
	return lpszBuf;
}

LPSTR UTF8ToGB2312(LPCSTR lpszInBuf)
{
	if(NULL == lpszInBuf)
	{
		return NULL;
	}
	LPWSTR lpszTmp = UTF8ToUnicode(lpszInBuf);
	LPSTR lpszBuf = UnicodeToGB2312(lpszTmp);
	delete[] lpszTmp;
	lpszTmp = NULL;
	return lpszBuf;
}

LPSTR GB2312Encoding(LPCSTR lpszInBuf)
{
	if(NULL == lpszInBuf)
	{
		return NULL;
	}
	const int nLen = strlen(lpszInBuf) * 3 + 1;
	CHAR* pBuf = new CHAR[nLen];
	memset(pBuf, 0, sizeof(CHAR) * nLen);
	CHAR szTmp[4] = {0};
	for(int i = 0; i != strlen(lpszInBuf); ++i)
	{
		if(IsDBCSLeadByte(lpszInBuf[i]))
		{
			sprintf_s(szTmp, _countof(szTmp), "%%%02X", lpszInBuf[i] & 0xFF);
		}
		else
		{
			sprintf_s(szTmp, _countof(szTmp), "%c", lpszInBuf[i]);
		}
		sprintf_s(pBuf + strlen(pBuf), nLen - strlen(pBuf), "%s", szTmp);
	}
	return pBuf;
}

LPSTR UTF8Encoding(LPCSTR lpszInBuf)
{
	if(NULL == lpszInBuf)
	{
		return NULL;
	}
	const int nLen = strlen(lpszInBuf) * 3 + 1;
	CHAR* pBuf = new CHAR[nLen];
	memset(pBuf, 0, sizeof(CHAR) * nLen);
	CHAR szTmp[4] = {0};
	for(int i = 0; i != strlen(lpszInBuf); ++i)
	{
		if(IsDBCSLeadByte(lpszInBuf[i]))
		{
			sprintf_s(szTmp, _countof(szTmp), "%%%02X", lpszInBuf[i] & 0xFF);
		}
		else
		{
			sprintf_s(szTmp, _countof(szTmp), "%c", lpszInBuf[i]);
		}
		sprintf_s(pBuf + strlen(pBuf), nLen - strlen(pBuf), "%s", szTmp);
	}
	return pBuf;
}

// 测试代码
#include "stdafx.h"
#include <Windows.h>
#include <strsafe.h>

int _tmain(int argc, _TCHAR* argv[])
{
	CHAR szText[] = "百度Hi";
	CHAR* pBuf = GB2312Encoding(szText);
	MessageBoxA(NULL, pBuf, NULL, 0);
	delete[] pBuf;
	pBuf = NULL;
	return 0;
}

转:http://blog.csdn.net/visualeleven/article/details/8121932
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:26625次
    • 积分:254
    • 等级:
    • 排名:千里之外
    • 原创:69篇
    • 转载:20篇
    • 译文:0篇
    • 评论:0条