ANSI
:多种编码方式的集合,ANSI
并不是一种真正的编码(规定了字符和二进制字节之间的转换关系)
Windows操作系统下,文件保存默认使用ANSI
编码
在Windows操作系统下,不同的语言对应于ANSI中的不同编码
如果当前操作系统语言为中文,则ANSI对应于GB2312
/GBK
编码;
如果当前操作系统语言为韩文,则ANSI对应于Shift_JIS
编码
如果当前操作系统语言为日文,则ANSI对应于Euc-kr
编码
…
ANSI兼容ASCII编码
UTF-8
:一种真正的编码,目前比较通用的一种变长的编码方式
Linux操作系统下的文件默认保存编码
适合存储/网络传输等
UNCODE
:一种真正的编码,不可变长,计算机在内存中使用这种编码操作数据
UNICODE
并不兼容ASCII
编码
由于UNCODE
编码的长度固定,因此计算机内存中使用此编码来统计字符串长度,搜索字符很方便
缺点是由于定长而导致的比较浪费空间,
GB2312
和GBK
的区别:GBK
包含GB2312
,他们的编码方式相同,只是GBK
添入一些GB2312
未编码的字符
Utf-8
和Unicode
互相转换
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[] 释放
ANSI
和UNCODE
互相转化
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[] 释放
ANSI
和UTF8
互相转化
//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;
}