设为首页 收藏本站
查看: 556|回复: 0

[经验分享] Windows核心编程(3)字符编码详解

[复制链接]

尚未签到

发表于 2018-6-18 06:10:30 | 显示全部楼层 |阅读模式
  一、字符编码 详细介绍
  1.字节(Byte)是一种计量单位,他是计算机信息技术存储容量的一种单位
  
  2.字符的意义: 字符数计算机文字中使用的文字和符号,比如1,2,3,4,~,@,!,%,^等待
  3.在不同编码里字符和字节对应的关系不同
  a.在ASCLL码中,一个英文字母(不区分大小写)占一个字节(8bit),一个汉子占两个字节(16bit)
  b.UTF-8编码中,一个英文字符等于一个字节,一个中文(含繁体)等于三个字节
  c.在Unicode编码中,一个英文两个字节, 一个中文(含繁体)占两个字节
  d.英文符号占一个字节,中文符号占两个字节
  4.多字符集 : 各国文字编码哟重叠的编码(编码冲突)导致乱码
  a.最开始,internet上只有一种字符集------ANS的ASCLL字符集,他用7bits表示一个字符,
  总共表示128个字符,包括英文字母,数字,标点符号,之后进行扩展,使用8bits表示一个字符
  可以表示256个字符, 再原来的7bits基础上加入了一些特殊字符.
  b.后来各国语音的加入,ASCLL已经不能满足需求,各国都在ASCLL的基础上制定了自己的
  字符集, 这些从ANSL标准派生的字符集被习惯的称为ANSL字符集
  正式名称MBCS(Multi-Byte Chactacter System,即多字节字符系统),每种语言都有自己的字符集
  导致各种字符集实在太多,在国际交流中非常不便, 因此提出了Unicode字符集
  它固定使用16 bits(两个字节、一个字)来表示一个字符,共可以表示65535个字符,将世界上
  所有语音常用字符都收录其中,(Unicode标准称为UTF-16),后来为了能使双字节的Unicode
  能够在现存的处理单字节系统上正确传输,出现了UTF-8,使用MBCS的方式对Unicode进行编码.
  UTF-8是编码,它属于Unicode字符集,
  5.Windows定义了一些数据类型
  a.wchar_t 就是两个字节 带有W的都是这个类型
  b.WCHAR Unicode字符 他其实就是wchar_t
  c.PWSTR 指向Unicode字符串的指针 wchar_t *
  d.PCWSTR 指向一个常量的Unicode const wchar_t *
  e.对应多字节的类型为 CHAR,LPSTR,LPCSTR
  f.ASNL/Unicode通用数据类型,
  TCAHR 多字符集中为char, Unicode中为wchar_t
  PTSTR 多字符集中为char *, Unicode中为wchar_t *
  LPCTSTR 多字符集中为const char *, Unicode中为const wchar_t *
  f.带有A就是多字符集, W就是Unicode(款字符),T就是通用的
  7.Windows中多字符集和Unicode相互转化的API
  a.WideCharToMultiByte 映射一个Unicode字符串到多字节字符串
  b.MultiByteToWideChar 映射一个多字节字符串到Unicode字符串
  8.函数 使用上面的函数比较复杂  则可以使用下面的宏函数
  使用之前要先声明标识符 USES_CONVERSION;
  A2W: 将多字节 转 宽字节
USES_CONVERSION  
CString str;
  
char* AChar = "abcdefg";
  
wchar_t* WChar = A2W(AChar);
  
str = WChar;
  W2A: 将款字节 转 多字节
USES_CONVERSION;  
wchar_t* AChar = L"abcdefg啊";
  
char* WChar = W2A(AChar);
  T2A: T代表跟随系统 转 多字节
USES_CONVERSION;  
char * pChar="char to cstring";
  
CString cTemp=A2T(pChar);
  T2W: 系统类型 转 款字节
SES_CONVERSION;  
CString cTemp =_T("char to cstring");
  
char * pChar=A2T(pChar);
  9.谨慎使用上面的宏函数转换
  a.如果你在一个循环里使用这个函数 可能会引起堆栈溢出
  因为你查看代码发现他函数里面会调用alloc申请内存,他会在函数的栈中分配,
  VC编译器默认是2M,在一个循环中调用这个函数就会一直分配内存.
  b.解决办法最好是使用 WideCharToMultiByte  MultiByteToWideChar
  这两个API,  把这两个API封装一下, 使用就很方便了.
  10.使用THAR _TEXT 可以同时适应Unicode和多字节字符集

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-525136-1-1.html 上篇帖子: find命令,linux和windows互传文件 下篇帖子: VMWare 中安装VMWareTools (Centos系统 和 Windows 系统)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表