宽字节、多字节、ANSI、UTF-8、unicode、GBK、之间的关系以及ANSI与UTF-8的相关转换

一、简单明了的说下这些区别和关系,网上说的太繁琐、或者太单一。

宽字节:通常用两个字节表示一个字符,对应的就是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就可以。

发布了23 篇原创文章 · 获赞 4 · 访问量 9966

猜你喜欢

转载自blog.csdn.net/hxp1994/article/details/100905140