简述各个编码概念
-
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
未编码的字符
ANSI,UTF-8,UNICODE字符在Windows下的转换:
convert_code.hpp
调用完不要忘记delete[]掉
//convert_code.hpp
//调用后不要忘记delete[]掉
#pragma once
#include <windows.h>
static const wchar_t* ConvertUtf8ToUnicode(const char* _ansiUtf8)
{
if (_ansiUtf8 == NULL)
{
return L"";
}
int len = MultiByteToWideChar(CP_UTF8, 0, _ansiUtf8, -1, NULL, 0);
wchar_t* wszUnicode = new wchar_t[(size_t)len + 1];
memset(wszUnicode, 0, ((size_t)len + 1) * sizeof(wchar_t));
MultiByteToWideChar(CP_UTF8, 0, _ansiUtf8, -1, wszUnicode, len);
return wszUnicode;
}
static const char* ConvertUnicodeToUtf8(const wchar_t* _szUnicode)
{
if (_szUnicode == NULL)
{
return "";
}
int len = WideCharToMultiByte(CP_UTF8, 0, _szUnicode, -1, NULL, 0, NULL, NULL);
char* szUtf8 = new char[(size_t)len + 1];
memset(szUtf8, 0, ((size_t)len + 1) * sizeof(char));
WideCharToMultiByte(CP_UTF8, 0, _szUnicode, -1, szUtf8, len, NULL, NULL);
return szUtf8;
}
static const wchar_t* ConvertAnsiToUnicode(const char* _szAnsi)
{
if (_szAnsi == NULL)
{
return L"";
}
int len = MultiByteToWideChar(CP_ACP, 0, _szAnsi, -1, NULL, 0);
wchar_t* wszUnicode = new wchar_t[(size_t)len + 1];
memset(wszUnicode, 0, ((size_t)len + 1) * sizeof(wchar_t));
MultiByteToWideChar(CP_ACP, 0, _szAnsi, -1, wszUnicode, len);
return wszUnicode;
}
static const char* ConvertUnicodeToAnsi(const wchar_t* _szUnicode)
{
if (_szUnicode == NULL)
{
return "";
}
int len = WideCharToMultiByte(CP_ACP, 0, _szUnicode, -1, NULL, 0, NULL, NULL);
char* szAnsi = new char[(size_t)len + 1];
memset(szAnsi, 0, ((size_t)len + 1) * sizeof(char));
WideCharToMultiByte(CP_ACP, 0, _szUnicode, -1, szAnsi, len, NULL, NULL);
return szAnsi;
}
static const char* ConvertAnsiToUtf8(const char* _szAnsi)
{
if (NULL == _szAnsi)
{
return "";
}
int dwAnsiLen = MultiByteToWideChar(CP_ACP, NULL, _szAnsi, -1, NULL, NULL);
wchar_t* szTmpUnicode = new wchar_t[(size_t)dwAnsiLen + 1];
memset(szTmpUnicode, 0, sizeof(wchar_t) * ((size_t)dwAnsiLen + 1));
MultiByteToWideChar(CP_ACP, NULL, _szAnsi, -1, szTmpUnicode, dwAnsiLen);
int dwUtf8Len = WideCharToMultiByte(CP_UTF8, 0, szTmpUnicode, -1, NULL, 0, NULL, NULL);
char* szUtf8 = new char[(size_t)dwUtf8Len + 1];
memset(szUtf8, 0, sizeof(char) * ((size_t)dwUtf8Len + 1));
WideCharToMultiByte(CP_UTF8, 0, szTmpUnicode, -1, szUtf8, dwUtf8Len, NULL, NULL);
delete[] szTmpUnicode;
return szUtf8;
}
static const char* ConvertUtf8ToAnsi(const char* _szUtf8)
{
if (NULL == _szUtf8)
{
return "";
}
int dwAnsiLen = MultiByteToWideChar(CP_UTF8, NULL, _szUtf8, -1, NULL, NULL);
wchar_t* szTmpUnicode = new wchar_t[(size_t)dwAnsiLen + 1];
memset(szTmpUnicode, 0, sizeof(wchar_t) * ((size_t)dwAnsiLen + 1));
MultiByteToWideChar(CP_UTF8, NULL, _szUtf8, -1, szTmpUnicode, dwAnsiLen);
int dwUtf8Len = WideCharToMultiByte(CP_ACP, 0, szTmpUnicode, -1, NULL, 0, NULL, NULL);
char* szAnsi = new char[(size_t)dwUtf8Len + 1];
memset(szAnsi, 0, sizeof(char) * ((size_t)dwUtf8Len + 1));
WideCharToMultiByte(CP_ACP, 0, szTmpUnicode, -1, szAnsi, dwUtf8Len, NULL, NULL);
delete[] szTmpUnicode;
return szAnsi;
}