在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

char wchar_t ascii unicode 之旅相关推荐

  1. String+char+byte+ascii+unicode

    众所周知,计算机底层的数据都是0和1. 那么我们在输入数字的时候,要交给计算机处理,首先要转化成计算机能识别的0和1的形式.那么文字是怎么样转化成0和1的呢? 通过字符集.常用的字符集是ASCII,每 ...

  2. ANSI,ASCII,UNICODE

    转载:http://blog.csdn.net/zj510/article/details/38368397 一直以来,编码问题都是比较令人纠结的,我自己也是,迷惑了好一段时间. 首先看一下ANSI编 ...

  3. TCHAR char wchar_t PTSTR PCSTR printf() wprintf()——_tprintf()解析

    TCHAR char wchar_t PTSTR PCSTR printf() _tprintf() 晕菜了吧? 转来一篇文章为大家解惑... Petzold的Programming Windows的 ...

  4. VC++中的char,wchar_t,TCHAR(转载)

    VC++中的char,wchar_t,TCHAR 大家一起做一个项目,经常发现有的人爱用strcpy等标准ANSI函数,有的人爱用_tXXXX函数,这个问题曾经搞的很混乱.为了统一,有必要把来龙去脉搞 ...

  5. ANSI,ASCII,Unicode的区别与联系

    为什么80%的码农都做不了架构师?>>>    ANSI,ASCII,Unicode的区别与联系 http://wenku.baidu.com/view/01d596e3524de5 ...

  6. char类型和Unicode编码

    [0]README 0.1)本文对 char类型和Unicode编码 的总结并不完整,仅供参考: 0.2)本文获取Unicode辅助字符的代码点的idea转自:  http://blog.csdn.n ...

  7. char*,wchar_t*,CString和BSTR之间的转换

    前言 本文并不尝试列举出所有的转换方法,只列举作者认为方便易用的方法. 1.char*和wchar_t*的相互转换 可以利用中间类_bstr_t(头文件comdef.h)方便的进行相互转换 const ...

  8. 关于char, wchar_t, TCHAR, _T(),L,宏 _T、TEXT,_TEXT

    char :单字节变量类型,最多表示256个字符, wchar_t :宽字节变量类型,用于表示Unicode字符, 它实际定义在<string.h>里:typedef unsigned s ...

  9. TCHAR char wchar_t 的区别

    有的人爱用strcpy等标准ANSI函数,有的人爱用_tXXXX函数,有必要把来龙去脉搞清楚. 为了搞清这些函数,就必须理请几种字符类型的写法.char就不用说了,先说一些wchar_t.wchar_ ...

  10. 关于char, wchar_t, TCHAR, _T,L,TEXT,_TEXT,LPSTR,LPCSTR,PWSTR,PCWSTR,LPTSTR,LPCTSTR的区别

    #ifdef UNICODE typedef wchar_t TCHAR; #else typedef unsigned char TCHAR; #endif typedef unsigned cha ...

最新文章

  1. pca主成分分析结果解释_SKLEARN中的PCA(Principal Component Analysis)主成分分析法
  2. mysql 查询优化器跟踪_3. select语句执行过程-优化器
  3. 01-java基础加强,eclipse工具使用,快捷键,断点调试,单元测试,jdk5新特性,增强for循环,集合map,list,可变参数,枚举,反射,泛型
  4. 解决前后台发送请求或者接口之间发送请求乱码的问题
  5. js 的正则表达式 部分展示test()方法的验证功能
  6. hanlp和jieba等六大中文分工具的测试对比
  7. mysql中将多行数据合并成一行数据
  8. 基于bootsplash的嵌入式linux启动画面定制
  9. Multisim14实现逻辑函数的化简与变换
  10. Qt 之 QQ系统表情(四)
  11. 你知道哪些中国学生普遍生疏但意境很美的英语词汇?
  12. 手写原笔迹输入_手写原笔迹输入SurfacePro使用更轻松
  13. 亲爱的热爱的百度云全集资源
  14. 第2章 无人艇局部危险避障算法研究
  15. 【ReID】Harmonious Attention Network for Person Re-Identification
  16. input 禁止弹出默认的键盘处理方法
  17. SSM框架与Springboot框架的区别
  18. 53 张图详解防火墙的 55 个知识点
  19. 一个水藻,经过两天的生长后,从第3天开始每天都会分裂出一个新藻,而分裂出的新藻同样经过两天的生长,也会从第3天开始每天分裂出一个新藻,问经过n天后,共有多少个水藻存在。暂时不考虑藻死亡的情况。
  20. 单片机“花式点灯”实现方法

热门文章

  1. 解决Delphi 2010启动时卡死并报displayNotification堆栈溢出错误
  2. tftp工具使用说明
  3. 机械工程专业英语复习
  4. 数学建模之十分钟学会LINGO(附建模实战)
  5. Java编写一个小游戏
  6. c语言程序设计实践教程课后题,《C语言程序设计实践教程》答案-完整版.doc
  7. 关于form提交后展示遮罩及显示进度条gif问题
  8. 单片机c语言音符发生,单片机C语言程序的设计实训100例基于8051Proteus仿真.doc
  9. html常用的英文字体,50款设计必备 英文字体
  10. 卡巴斯基2014/10.0 KEY文件下载 - KES 10.0下载