在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