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

转载 2015年11月18日 16:57:30
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

相关文章推荐

PB9利用ADODB.Stream和ToUniCode()及ToAnsi()两个函数实现UTF-8及GB2312的转换

PB9利用ADODB.Stream和ToUniCode()及ToAnsi()两个函数实现UTF-8及GB2312的转换 下面的列子是将ANSI的文本文件转换成UTF-8的文本文件 integer ...
  • hwhone
  • hwhone
  • 2012-06-15 09:32
  • 2500

pb字符串实现GB2312与Unicode、UTF8之间的相互转换

以下对象用于字符串PB实现GB2312与Unicode、UTF8之间的相互转换,对象的代码将持续完善   $PBExportHeader$n_cst_unicode_cvt.sru forwar...

关于编码: ascii(ansi), gb-2312, unicode, utf8

很久很久以前,有一群人,他们决定用8个可以开合的晶体管来组合成不同的状态,以表示世界上的万物。他们看到8个开关状态是好的,于是他们把这称为"字节"。         再后来,他们又做了一些可以处理这...
  • lgouc
  • lgouc
  • 2012-05-10 11:20
  • 742

汉字编码对照表(gb2312/unicode/utf8)

一、汉字编码的种类    汉字编码中现在主要用到的有三类,包括GBK,GB2312和Big5。    1、GB2312又称国标码,由国家标准总局发布,1981年5月1日实施,通行于大陆。新加坡等地也使...

ASCI, GB2312, UNICODE, UTF8编码比较

ASCI, GB2312, UNICODE, UTF8编码比较,以及二进制存储

汉字编码对照表(gb2312/unicode/utf8)

一、汉字编码的种类     汉字编码中现在主要用到的有三类,包括GBK,GB2312和Big5。     1、GB2312又称国标码,由国家标准总局发布,1981年5月1日实施,通行于大陆...

vb URL编码 unicode中文互转, gb2312中文互转, utf8中文互转

'//vb将unicode转成汉字, Public Function unicodeDecode(strCode As String) As String Dim Char As S...

从字符编码的发展历史理解ANSI、GB2312、Unicode、UTF8和UTF16区别

在编程学习的深入后,不可避免的会遇到ANSI、GB2312、UTF8的编码问题,如果不彻底了解他们的区别,都最终会造成一个问题--乱码!例如文件打开乱码,数据库乱码、网页乱码等等各种乱码,这里就通过字...

对字符编码与Unicode,ISO 10646,UCS,UTF8,UTF16,GBK,GB2312的理解

——————————- Unicode: unicode.org制定的编码机制, 要将全世界常用文字都函括进去. 在1.0中是16位编码, 由U+0000到U+FFFF. 每个2b...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)