C/C++中文的编码和字符串处理

Blog已迁至 新地址html

 

windows平台  git

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

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

Linux平台   windows

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

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

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

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

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

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

相关文章
相关标签/搜索