转载链接:https://www.cnblogs.com/akb48/p/5439154.html

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。

C++ 字符串的编码的更多相关文章

  1. Python字符串的编码与解码(encode与decode)

    首先要搞清楚,字符串在Python内部的表示是unicode编码,因此,在做编码转换时,通常需要以unicode作为中间编码,即先将其他编码的字符串解码(decode)成unicode,再从unico ...

  2. python基础——字符串和编码

    python基础——字符串和编码 字符串也是一种数据类型,但是,字符串比较特殊的是还有一个编码问题. 因为计算机只能处理数字,如果要处理文本,就必须先把文本转换为数字才能处理.最早的计算机在设计时采用 ...

  3. 中文字符串的编码转换(c实现)

    中文字符串在c/c++中表示为字节序列,在分词的时候需要根据不同的编码方式进行分词,一般分词器需要转换成统一的编码方式再进行转换,有些分词器如ICTCLAS在分词的时候可以不显示定义编码方式,可以检测 ...

  4. java转换字符串的编码(转)

    package com.Alex.base; import java.io.UnsupportedEncodingException; /** * 转换字符串的编码 */ public class C ...

  5. python入门(9)字符串和编码

    python入门(9)字符串和编码 字符串是一种数据类型,比较特殊的是字符串有一个编码问题. 因为计算机只能处理数字,如果要处理文本,就必须先把文本转换为数字才能处理. 最早的计算机在设计时采用8个比 ...

  6. python笔记二(数据类型和变量、编码方式、字符串的编码、字符串的格式化)

    一.数据类型 python可以直接处理的数据类型有:整数.浮点数.字符串.布尔值.空值. 整数 浮点数 字符串:双引号内嵌套单引号,可以输出 i'm ok. 也可以用\来实现,\n 换行 \t tab ...

  7. python基础——字符串、编码、格式化

    1.三种编码:ascii Unicode utf8 2.字符串和编码数字的两个函数:ord(字符转数字ord(‘A’)=65)和 chr(数字转字符chr(65)=A) 3.bytes存储编码,记住两 ...

  8. c# 对html字符串进行编码

    /// <summary> /// 对html字符串进行编码 /// </summary> /// <param name="html">htm ...

  9. python教程1:Python基础之数据类型和变量、字符串和编码

    视频链接:http://www.bilibili.com/video/av10730372/ 我是在Linux下玩python的,Linux下默认安装python,直接打个pyhon3就好了,pyth ...

  10. JavaScript escape() unescape() decodeURI()函数对字符串进行编码解码

    定义和用法 escape() 函数可对字符串进行编码,这样就可以在所有的计算机上读取该字符串. 语法 escape(string) 参数 描述 string 必需.要被转义或编码的字符串. 返回值 已 ...

随机推荐

  1. 【BZOJ4259】残缺的字符串(FFT)

    [BZOJ4259]残缺的字符串(FFT) 题面 给定两个字符串\(|S|,|T|\),两个字符串中都带有通配符. 回答\(T\)在\(S\)中出现的次数. \(|T|,|S|<=300000\ ...

  2. 【BZOJ1821】[JSOI2010]部落划分(二分,并查集)

    [BZOJ1821][JSOI2010]部落划分(二分,并查集) 题面 BZOJ 洛谷 题解 二分答案,把距离小于二分值的点全部并起来,\(\mbox{check}\)一下是否有超过\(K\)个集合就 ...

  3. 【BZOJ1818】[CQOI2010]内部白点(树状数组,扫描线)

    [BZOJ1818][CQOI2010]内部白点(树状数组,扫描线) 题面 BZOJ 题解 不难发现\(-1\)就是在搞笑的. 那么对于每一行,我们显然可以处理出来最左和最右的点,那么等价于我们在横着 ...

  4. NOI2018退役记

    NOI2018退役记 终于我也退役了-- Day0 高中毕业前最后一次坐飞机了--在机场干什么呢?当然是打元气打元气打元气.下飞机干什么呢?当然是打元气打元气打元气. 有接机服务,大巴上有个导游,又向 ...

  5. BZOJ 2434 阿狸的打字机 | AC自动机

    题目戳这里 AC自动机上有神奇的东西叫做fail指针--所有fail指针连起来恰好构成一棵以1为根的树! 而这道题问x在y中出现过多少次,就是问Trie树上根到y的结束节点的路径上有多少节点能通过跳f ...

  6. 利用docker进行基础镜像制作

    前言 最近想通过Javaee来开发博客,但是不想因为环境配置问题总是耗时间配置相关配置,所以萌生出用docker镜像来搭建web的系统环境,也是作为docker学习实践的笔记. docker hub注 ...

  7. centos6.5安装jdk(解压tar.gz)

    0.说明 下载jdk文件包jdk-7u79-linux-x64.tar.gz. 1.环境清理(系统自带的OpenJDK) 1.1 查看OpenJDK的安装包 $ rpm -qa |grep java ...

  8. Codeforces 382 D Permutations

    题目大意: 给出一张二分图,这张二分图完美匹配的个数是奇数,求删掉第$i(1<=i<=m)$条边后完美匹配个数的奇偶性. 设这张图的邻接矩阵为$A$,那么完美匹配的个数为$A$的积和式,即 ...

  9. 【POJ1151】Atlantis

    题目大意:给定 N 个矩形,求这些矩形的面积并. 题解:采用扫描线算法. 首先,按照矩形的横坐标排序,在纵坐标方向上维护一根扫描线被覆盖的长度,在这里采用线段树维护.统计答案时,从左到右扫描 2N 个 ...

  10. ReactNative组件之scrollView实现轮播

    想要实现轮播效果,首先安装时间定时器 接下来就是在我们的项目中使用定时器 接下来我们将竖着的轮播图变成横着的 接下来我们调整间距 我们知道轮播图下方,还有5个圆点,那我们怎么做呢? 拿到每一个圆点 看 ...