Windows下的字符编码转换

简述各个编码概念

  • ANSI:多种编码方式的集合,ANSI并不是一种真正的编码(规定了字符和二进制字节之间的转换关系)
    Windows操作系统下,文件保存默认使用ANSI编码
    在Windows操作系统下,不同的语言对应于ANSI中的不同编码
    如果当前操作系统语言为中文,则ANSI对应于GB2312/GBK编码;
    如果当前操作系统语言为韩文,则ANSI对应于Shift_JIS编码
    如果当前操作系统语言为日文,则ANSI对应于Euc-kr编码

    ANSI兼容ASCII编码

  • UTF-8:一种真正的编码,目前比较通用的一种变长的编码方式
    Linux操作系统下的文件默认保存编码
    适合存储/网络传输等

  • UNCODE:一种真正的编码,不可变长,计算机在内存中使用这种编码操作数据
    UNICODE并不兼容ASCII编码
    由于UNCODE编码的长度固定,因此计算机内存中使用此编码来统计字符串长度,搜索字符很方便
    缺点是由于定长而导致的比较浪费空间,

GB2312GBK的区别:GBK包含GB2312,他们的编码方式相同,只是GBK添入一些GB2312未编码的字符

ANSI,UTF-8,UNICODE字符在Windows下的转换:

Utf-8Unicode互相转换

wchar_t * Utf8ToUnicode(const char * ansiUtf8) 
{
	if(ansiUtf8==NULL)
	{
		return NULL;
	}
	int len=MultiByteToWideChar(CP_UTF8, 0, ansiUtf8, -1, NULL,0);
	wchar_t * wszUnicode = new wchar_t[len+1];
	memset(wszUnicode, 0, (len+1) * sizeof(wchar_t));
	MultiByteToWideChar(CP_UTF8, 0, ansiUtf8, -1, wszUnicode, len);	
	return wszUnicode;
}


char * UnicodeToUtf8(const wchar_t* szUnicode) 
{
	if(szUnicode==NULL)
	{
		return NULL;
	}
	int len=WideCharToMultiByte(CP_UTF8, 0, szUnicode, -1, NULL, 0, NULL, NULL);
	char *szUtf8 = new char[len+1];
	memset(szUtf8, 0, (len+1) * sizeof(char));
	WideCharToMultiByte(CP_UTF8, 0, szUnicode, -1, szUtf8, len, NULL, NULL);	
	return szUtf8;
}
//使用完毕需调用Delete[] 释放

ANSIUNCODE互相转化

wchar_t * AnsiToUnicode(const char * _szAnsi) 
{
	if(_szAnsi==NULL)
	{
		return NULL;
	}
	int len=MultiByteToWideChar(CP_ACP, 0, _szAnsi, -1, NULL,0);
	wchar_t * wszUnicode = new wchar_t[len+1];
	memset(wszUnicode, 0, (len+1) * sizeof(wchar_t));
	MultiByteToWideChar(CP_ACP, 0, _szAnsi, -1, wszUnicode, len);	
	return wszUnicode;
}


char * UnicodeToAnsi(const wchar_t* _szUnicode) 
{
	if(_szUnicode==NULL)
	{
		return NULL;
	}
	int len=WideCharToMultiByte(CP_ACP, 0, _szUnicode, -1, NULL, 0, NULL, NULL);
	char *szUtf8 = new char[len+1];
	memset(szUtf8, 0, (len+1) * sizeof(char));
	WideCharToMultiByte(CP_ACP, 0, _szUnicode, -1, szUtf8, len, NULL, NULL);	
	return szUtf8;
}
//使用完毕需调用Delete[] 释放

ANSIUTF8互相转化

//ANSI和UTF8转换必须先借助于UNCODE编码
BOOL ConvertAnsiToUtf8(const char *_szAnsi, char *_szUtf8, DWORD _dwLenMax)
{
	if(NULL == _szAnsi || NULL == _szUtf8 || 0 == _dwLenMax)
	{
		return FALSE;
	}
	DWORD dwAnsiLen = MultiByteToWideChar(CP_ACP, NULL, _szAnsi, -1, NULL, NULL);
	if(dwAnsiLen > _dwLenMax -1)
	{
		return FALSE;
	}
	wchar_t *szTmpWide = new wchar_t[dwAnsiLen + 1];
	MultiByteToWideChar(CP_ACP, NULL, _szAnsi, -1, szTmpWide, dwAnsiLen);
	WideCharToMultiByte(CP_UTF8, NULL, szTmpWide, -1, _szUtf8, _dwLenMax, NULL, FALSE);
	delete[] szTmpWide;
	return TRUE;
}


BOOL ConvertUtf8ToAnsi(const char *_szUtf8, char *_szAnsi, DWORD _dwLenMax)
{
	if(NULL == _szUtf8 || NULL == _szAnsi|| 0 == _dwLenMax)
	{
		return FALSE;
	}
	DWORD dwUtf8Len = MultiByteToWideChar(CP_UTF8, NULL, _szUtf8, -1, NULL, NULL);
	if(dwUtf8Len > _dwLenMax -1)
	{
		return FALSE;
	}
	wchar_t *szTmpWide = new wchar_t[dwUtf8Len];
	MultiByteToWideChar(CP_UTF8, NULL, _szUtf8, -1, szTmpWide, dwUtf8Len);
	WideCharToMultiByte(CP_UTF8, NULL, szTmpWide, -1, _szAnsi, _dwLenMax, NULL, FALSE);
	delete[] szTmpWide;
	return TRUE;
}

你可能感兴趣的:(编程,Windows)