windows平台  

        char 表示单字符,占用一个字节

        wchar_t 表示宽字符,占用两个字节

Linux平台   

        char 占用一个字节
        wchar_t 占用四个字节

windows平台下对于用字符串保存中文的问题,GBK和UTF8都是用char来表示,只是为了表示一个中文字符需要用到多个char。而对于UNICODE(其实应该说是UFT16),每一个字符都需要一个两个字节,也就是用wchar_t表示。

UNICODE只是一个字符集,规定了不同的字符对应于一个唯一的整数,平时所说的使用UNICODE编码其实说的是UFT16编码(顾名思义就是用16位来表示一个字符)。

UTF8、UTF16和UFT32则是基于UNICODE字符集的三种编码方式。不同之处是:对于一个字符所对应的整数,应该怎样用二进制位表示出来。对于UTF16和UTF32,不管字符对应的数字是多少,都用恒定的多字节表示,所以可以很方便的表示一个字符,但需要注意字节序问题。比较麻烦的是UFT8,对于不同的字符,可能会用到一个字节,两个字节到最多六个字节。这么做的好处是节省了空间。

在实际使用字符串保存时,因为UTF16不管什么字符,都用2个字节表示,所以可能会出现某一个字节全零的情况。例如字符‘A’编码是0x41,用UTF16表示就是0x0041。对于char表示的字符串,以0x00表示结尾,所以没有办法正确的存储此类数据,此时只能用wchar_t来保存。

UTF8编码方式如下:用1~6个字节存储一个字符,当第一个字节的首位为0时,表示这个字符只用一个字节表示(刚好与ASCII码一一对应),当用多字节表示一个字符时,首字节以连续的多个1和一个0开始,表示用多个字节。例如用3个字节是,首字节为1110xxxx,后面各字节均以10开始。

UNICODE原码(16进制) UTF8(2进制)
0000-007F 0xxxxxxx
0080-07FF 110xxxxx 10xxxxxx
0800-FFFF 1110xxxx 10xxxxxx 10xxxxxx
......

如上所示,UTF8中的‘x’就是实际表示字符编码的位。表示的最大值就是全1的情况,最小值就是少一个字节的情况下最大值加1,因为少一个字节已经可以存的下的字符,不会用多一个字节来保存。由上可知,UTF8可以直接用char类型的字符串来表示,只是用对应的解释方式来解释就可以正确显示了。

另外一种就是GBK等编码方式。这一类编码方式和UNICODE没有任何关系,是另一种字符集和编码方式的规定。使用方法可以类比于UTF8,在编码小于128时,就是ASCII,而中文的编码均大于128,用超过一个字节来表示。在平时编写的windows程序中,可以理解为如果使用了UNICODE宏,就是在用wchar_t来表示中文,使用UTF16编码,如果没有UNICODE宏,那么就是在用GBK,以char来表示中文。

windows平台下的TCHAR类型就是通过宏对char和wchar_t的封装。可根据当前平台情况选择对应的类型。_T修饰的字符串常量同理,根据是否定义的UNICODE宏,分别表示""或L""。

Linux平台的不同在于,wchar_t用4个字节表示,也就是UCS-4,而windows用两个字节,UCS-2。

参考:

http://www.cnblogs.com/KevinYang/archive/2010/06/18/1760597.html

http://blog.csdn.net/shellching/article/details/5316442

C/C++中文的编码和字符串处理的更多相关文章

  1. base64编码的字符串(含有中文) 前端解码

    base64编码的字符串(含有中文) 前端解码 https://xue5602.github.io/2018/12/19/atob%E8%A7%A3%E7%A0%81utf-8%E5%AD%97%E7 ...

  2. 关于HTTP GET请求的url中文参数编码

    场景:前端用JS构造了一个GET请求,携带了一个中文的参数,通过Spring MVC传到后台以后解析中文是乱码. 1. 发送请求,从浏览器中捕获到http的请求内容如下: Remote Address ...

  3. php unicode编码和字符串互转

    php字符串转Unicode编码, Unicode编码转php字符 百度了很多,都一样, 要么不对, 要不就是只是把字符串的汉字转Unicode 经过多次试验查找, 找到了如下方法, 注意:字符串编码 ...

  4. Python中编码和字符串

    编码和字符串 编码 在学习回顾中总结一下ASCII编码.Unicode编码和utf-8编码. 计算机中只能处理数字,我们若要处理文本的话就要将文件转换为数字.所以,这就涉及该怎样转换的问题,也就是编码 ...

  5. iOS - 网址、链接、网页地址、下载链接等正则表达式匹配(解决url包含中文不能编码的问题)

    DNS规定,域名中的标号都由英文字母和数字组成,每一个标号不超过63个字符,也不区分大小写字母.标号中除连字符(-)外不能使用其他的标点符号.级别最低的域名写在最左边,而级别最高的域名写在最右边.由多 ...

  6. 小学生都能学会的python(编码 and 字符串)

    小学生都能学会的python(编码 and 字符串) 一,编码 最早的计算机编码是ASCII. 有英文+数字+特殊字符 8bit => 1byte 没有中文, 后面的编码必须兼容ASCII    ...

  7. python-字符编码、字符串格式化、进制转化、数据类型、列表、元组、字典总结

    目录: 一.字符编码 二.字符串格式化 三.进制转换 四.数据类型及其操作 五.字符串转换 六.列表 七.元组 八.字典 一.字符编码: 计算机由美国人发明,最早的字符编码为ASCII,只规定了英文字 ...

  8. java.net.URLEncoder对中文的编码和解码

    // java.net.URLEncoder对中文的编码和解码String str = URLEncoder.encode("测试字符串", "utf-8"); ...

  9. 编码占用的字节数 1 byte 8 bit 1 sh 1 bit 中文字符编码 2. 字符与编码在程序中的实现 变长编码 Unicode UTF-8 转换 在网络上传输 保存到磁盘上 bytes

    小结: 1.UNICODE 字符集编码的标准有很多种,比如:UTF-8, UTF-7, UTF-16, UnicodeLittle, UnicodeBig 等: 2 服务器->网页 utf-8 ...

随机推荐

  1. ambari的重新安装

    ambari是什么呢? 这里我简单说一下ambari的目的,他的目的就是简化hadoop集群的安装和管理.对于安装简化到什么地步呢?只需要几个命令,在页面上配置几个参数,几百几千个节点的集群就能安装成 ...

  2. Get familiar with key Frameworks of ios

    Frameworks make your life easier as an iOS Developer. They allow you to reuse code written by other ...

  3. CF 19D 线段树+set压缩坐标轴+离散化map

    题意: n个操作,在200000*200000的平面上加删点 find 严格在坐标右上角,x最小,再y最小的点 线段树做,区间为离散化后的 X轴坐标 ,维护区间点数 和 最小的 y 值 ( 维护最小y ...

  4. 输入框修改placeholde颜色

    ::-webkit-input-placeholder { color: red; } :-moz-placeholder {/* Firefox 18- */ color: red; } ::-mo ...

  5. Java类加载机制深度分析

    转自:http://my.oschina.net/xianggao/blog/70826 参考:http://www.ibm.com/developerworks/cn/java/j-lo-class ...

  6. [C#] 常用工具类——系统日志类

    using System; using System.Collections.Generic; using System.Text; using System.Diagnostics; namespa ...

  7. BA的广度和深度

    http://insights.thoughtworkers.org/ba-capability-and-development-path-in-thoughtworks/ 作者:ThoughtWor ...

  8. 王灏:光音网络致力打造Wi-Fi大生态圈

    光音网络,做的是本地网络综合服务.在中国,想把互联网做到覆盖延伸范围之外的最后100米,光音网络是当中一家,也是最坚持的一家.为千万家本地生活商户提供帮助,为数亿本地用户提供最佳的本地网络体验,这是光 ...

  9. SPOJ 1043 1043. Can you answer these queries I

    思路:用TREE记录节点的最大连续和,LEF记录左边开始的最大连续和,RIG记右边开始的最大连续和 然后处理的时候就是比较左边最大,右边最大  中间区间的问题 其中这个query 只能膜拜了... 大 ...

  10. linux IO 内核参数调优 之 原理和参数介绍

    1.  page cache linux操作系统默认情况下写都是有写缓存的,可以使用direct IO方式绕过操作系统的写缓存.当你写一串数据时,系统会开辟一块内存区域缓存这些数据,这块区域就是我们常 ...