char wchar_t ascii unicode 之旅

                          在window32开发中 ,char占用一个字节,wchar_t占用两个字节。ascii字符集 用char表示。unicode字符集用wchar_t表示。

              我们是否经常听到这样一句话。用 string表示的占用内存比较少。wstring表示的占用内存比较多。起初我也是这么认为的,所以我经常使用string.虽然我知道win32内部是用unicode表示的。例如,我们经常可以接触到  win32的两个版本的函数 以A和W为后缀的函数(例如,GetModuleFileNameA,GetModuleFileNameW) ,其实 以A为后缀的函数只是分配内存,把char字符转换成wchar_t字符。最终还是调用对应的以W为后缀的函数。所以,曾经的我一直,在考虑,到底用那种方式好呢。节省内存还是提高性能尼 ?

             真是让人迷茫啊。但这一切即将,烟消云散。一切都恍然大悟。

             char占用一个字节,wchar_t占用两个字节,是对的。ascii字符集占用一个字节,unicode字符集占用两个字节,也是对的。

             中文用两个字节表示(重点) ,不管我们char,还是wchar_t来存储中文,每个中文字符都占用两个字节。除了最后一个结束字符( 0 ) 。在char中,用一个字符表示。在wchar_t中,用两个字符表示。

             ok  上代码吧,看完代码,你就会懂了 !

#include <stdio.h>
#include <string>

inline 
void _output(const char* psz, int iBytelen)
{
	printf("占用内存: %d 字节\n", iBytelen);
	printf("内存内容: ");
	for (int i = 0; i < iBytelen; i++)
	{
		printf("0x%02x ", (unsigned char)*(psz + i));
	}
	printf("\n");
}

void outputA(const char* psz, int iBytelen)
{
	printf("char[]: %s\n", psz);
	_output(psz, iBytelen);
}

void outputW(const wchar_t* wpsz, int iBytelen)
{
	setlocale(LC_ALL, "chs");					//乱码问题
	wprintf(L"wchar_t[]: %s\n", wpsz);
	setlocale(LC_ALL, "c");
	_output((const char*)wpsz, iBytelen);
}

int 
main(void)
{
#define TEST_MAX_SIZE	100
#define _TO_W(str)		L ## str
#define TO_W(str)		_TO_W(str)
#define CHINA_STR_TEST	"我们是中华民族!"
#define WCHINA_STR_TEST TO_W(CHINA_STR_TEST)
#define ENGLISH_STR_TEST "english"
#define WENGLISH_STR_TEST TO_W(ENGLISH_STR_TEST)

	char	China[TEST_MAX_SIZE]	= CHINA_STR_TEST;
	wchar_t	wChina[TEST_MAX_SIZE]	= WCHINA_STR_TEST;
	char    English[TEST_MAX_SIZE]	= ENGLISH_STR_TEST;
	wchar_t wEnglish[TEST_MAX_SIZE] = WENGLISH_STR_TEST;

	int iCa_bytelen		= sizeof(CHINA_STR_TEST);
	int iwCa_bytelen	= sizeof(WCHINA_STR_TEST);
	int iEh_bytelen		= sizeof(ENGLISH_STR_TEST);
	int iwEh_bytelen	= sizeof(WENGLISH_STR_TEST);

	outputA(China, iCa_bytelen);
	outputW(wChina, iwCa_bytelen);
	outputA(English, iEh_bytelen);
	outputW(wEnglish, iwEh_bytelen);

	while (true);
}


运行结果:

其实,中文的字符集,本来就占用两个字节,不管用char  存储,还是用 wchar_t 存储。因此,我们开发程序的时候,我们的字符串多数是用中文的,少数用到英文。只有英文会浪费掉一半的内存,中文只会浪费一个字节的内存(最后一个 0 字符 ) .所以,对于开发中文字符集的程序,我们用wchar_t (unicode)字符集就行了。我们也可以完全用wstring使用,因为,一切都不是绝对的。 wstring虽然用两个字节来表示一个字符,但是对英文而言的,对我们中文而言,wstring 只会比 string多浪费少量的字节(一个或一个以上字节。我没有彻底研究string wstring ,所以不乱下结论,但可以肯定的是,不会像英文那样浪费一半或一半以上的字节)。


这篇文章写得很多bug 比如ansi字符集占用一个字节,但后来,我看了  下面链接的文章,就比较彻底得明白了字符集编码了

http://blog.csdn.net/softman11/article/details/6124345

http://blog.csdn.net/hanford/article/details/53391891



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值