一、简单明了的说下这些区别和关系,网上说的太繁琐、或者太单一。
宽字节:通常用两个字节表示一个字符,对应的就是Unicode。
多字节:用多个字节表示一个字符,对应的就是ANSI。
ANSI:他的产生源于ASCII字符集,最开始7个bits,总共代表了128个字符,包括英文、字母、数字、和一些特殊字符。后面由于各个国家为了彰显自己的本土语音,进行了扩充,产生了 GB2312, BIG5, JIS等编码,形成了ANSI编码,现在可以看到一些把和ASCII和GBK混合在一起说就是这个原因。
Unicode:他的产生是为了统一不同国家的字符编码,不同的语言无法存储在同一段 ANSI 编码的文本中,因此中间桥梁Unicode出现了,Unicode把所有语言都统一到一套编码里,因此就不要出现乱码情况。因此他又有另一个名字:万国码。
GBK:它是之前提到的由ANSI产生的GB2312的一个扩充,相当于增强版,收录了更过的汉字字符。
二、ANSI与UTF-8之间的转换。
(1)直接在VS上面复制粘贴即可运行
#include<stdio.h>
#include<windows.h>
#define CODE_LEN 256
void AnsiToUtf8(char* lpcszStr, char* lpwszStr)
{
WCHAR* strA;
int i = MultiByteToWideChar(CP_ACP, 0, lpcszStr, -1, NULL, 0);
strA = new WCHAR[i];
MultiByteToWideChar(CP_ACP, 0, lpcszStr, -1, strA, i);
i = WideCharToMultiByte(CP_UTF8, 0, strA, -1, NULL, 0, NULL, NULL);
char* strB = new char[i];
WideCharToMultiByte(CP_UTF8, 0, strA, -1, lpwszStr, i, NULL, NULL);
}
void Utf8ToAnsi(char* lpcszStr, char* lpwszStr)
{
DWORD dwMinSize;
WCHAR* strTmp;
dwMinSize = MultiByteToWideChar(CP_UTF8, 0, lpcszStr, -1, NULL, 0);
strTmp = new WCHAR[dwMinSize];
MultiByteToWideChar(CP_UTF8, 0, lpcszStr, -1, strTmp, dwMinSize);
int targetLen = WideCharToMultiByte(CP_ACP, 0, (LPWSTR)strTmp, -1, (char*)lpwszStr, 0, NULL, NULL);
WideCharToMultiByte(CP_ACP, 0, (LPWSTR)strTmp, -1, (char*)lpwszStr, targetLen, NULL, NULL);
}
int main()
{
char str1_src[CODE_LEN] = "测试";
char str2_des[CODE_LEN] = { 0 };
char str3_src[CODE_LEN] = "娴嬭瘯";
char str4_des[CODE_LEN] = { 0 };
AnsiToUtf8(str1_src, str2_des);
printf("测试的ANSI转换成utf-8为:%s----->%s\n\n",str1_src, str2_des);
Utf8ToAnsi(str3_src, str4_des);
printf("测试的utf-8转换成ANSI为:%s----->%s",str3_src, str4_des);
return 0;
}
(2)运行结果
(3)注意:假如在VC6.0上面运行创建的不使用C++风格那么需要注意里面使用到的new运算符,此时只需要使用malloc就可以。