各种字符集及其区别

各种字符集

第一部分

为啥需要Unicode

刚开始的时候就有ASCII字符集(American Standard Code for Information Interchange"美国信息交换标准码),它使用7 bits来表示一个字符,总共表示128个字符,我们一般都是用字节(byte,801)来作为基本单位.那么怎么当用一个字节来表示字符时第一个bit总是0,剩下的七个字节就来表示实际内容.后来IBM公司在此基础上进行了扩展,用8bit来表示一个字符,总共可以表示256个字符.也就是当第一个bit0时仍表示之前那些常用的字符.当为1时就表示其他补充的字符.

 英文字母再加一些其他标点字符之类的也不会超过256.一个字节表示主足够了.但其他一些文字不止这么多 ,像汉字就上万个.于是又出现了Unicode

1、Unicode详细介绍

Unicode是用065535之间的数字来表示所有字符.其中0127128个数字表示的字符仍然跟ASCII完全一样.65536216次方.这是第一步.第二步就是怎么把065535这些数字转化成01串保存到计算机中.这肯定就有不同的保存方式了.于是出现了UTF(unicode transformation format),UTF-8,UTF-16.UTF-8,UTF-16都属于unicode

UTF-8 UTF-16的区别

UTF-16比较好理解,就是任何字符对应的数字都用两个字节来保存.我们通常对Unicode的误解就是把UnicodeUTF-16等同了.但是很显然如果都是英文字母这做有点浪费.明明用一个字节能表示一个字符为啥整两个啊.

 于是又有个UTF-8,这里的8非常容易误导人,8不是指一个字节,难道一个字节表示一个字符?实际上不是.当用UTF-8时表示一个字符是可变的,有可能是用一个字节表示一个字符,也可能是两个,三个.当然最多不能超过3个字节了.反正是根据字符对应的数字大小来确定.

UTF-16表示""

假如用UTF-16表示的话就是01101100   01001001(16 bit,两个字节).程序解析的时候知道是UTF-16就把两个字节当成一个单元来解析.这个很简单.

UTF-8表示""

UTF-8就有复杂点.因为此时程序是把一个字节一个字节的来读取,然后再根据字节中开头的bit标志来识别是该把1个还是两个或三个字节做为一个单元来处理.

0xxxxxxx,如果是这样的01,也就是以0开头后面是啥就不用管了XX代表任意bit.就表示把一个字节做为一个单元.就跟ASCII完全一样.

110xxxxx 10xxxxxx.如果是这样的格式,则把两个字节当一个单元

1110xxxx 10xxxxxx 10xxxxxx 如果是这种格式则是三个字节当一个单元.

这是约定的规则.你用UTF-8来表示时必须遵守这样的规则.我们知道UTF-16不需要用啥字符来做标志,所以两字节也就是216次能表示65536个字符.

由上面我们可以看出UTF-8需要判断每个字节中的开头标志信息,所以如果一当某个字节在传送过程中出错了,就会导致后面的字节也会解析出错.UTF-16不会判断开头标志,即使错也只会错一个字符,所以容错能力强.

Unicode版本2

前面说的都是unicode的第一个版本.65536显然不算太多的数字,用它来表示常用的字符是没一点问题.足够了,但如果加上很多特殊的就也不够了.于是从1996年开始又来了第二个版本.用四个字节表示所有字符.这样就出现了UTF-8,UTF16,UTF-32.UTF-32就是把所有的字符都用32bit也就是4个字节来表示.然后UTF-8,UTF-16就视情况而定了.UTF-8可以选择18个字节中的任一个来表示.UTF-16只能是选两字节或四字节

 

2、ANSI又是啥

其实ANSI并不是某一种特定的字符编码,而是在不同的系统中,ANSI表示不同的编码。

3、中文编码GBK、GB2312、GB18030

规定:一个小于127的字符的意义与原来相同,但两个大于127的字符连在一起时,就表示一个汉字前面的一个字节(称之为高字节),把这种汉字方案叫做 “GB2312″GB2312 是对 ASCII 的中文扩展。

但是中国的汉字太多了,后来还是不够用,于是干脆不再要求低字节一定是127号之后的内码,只要第一个字节是大于127就固定表示这是一个汉字的开始,不管后面跟的是不是 扩展字符集里的内容。结果扩展之后的编码方案被称为 GBK 标准,

后来少数民族也要用电脑了,于是我们再扩展,又加了几千个新的少数民族的字,GBK 扩成了 GB18030

4、VC中的多字节字符集又是啥

各国在ASCII的基础上制定了自己的字符集,这些从ANSI标准派生的字符集被习惯的统称为ANSI字符集,它们正式的名称应该是MBCS(Multi-Byte Chactacter System,即多字节字符

第二部分

 

2、gbk和utf8的区别

GBK编码:是指中国的中文字符,其它它包含了简体中文与繁体中文字符,另外还有一种字符gb2312”,这种字符仅能存储简体中文字符。

UTF-8编码:它是一种全国家通过的一种编码,如果你的网站涉及到多个国家的语言,那么建议你选择UTF-8编码。

GBKUTF8有什么区别?

UTF8编码格式很强大,支持所有国家的语言,正是因为它的强大,才会导致它占用的空间大小要GBK大,对于网站打开速度而言,也是有一定影响的。

GBK编码格式,它的功能少,仅限于中文字符,当然它所占用的空间大小会随着它的功能而减少,打开网页的速度比较快。

 

 

 

 

第三部分

注意事项

1、有关字符转化的问题多半要用到new函数,所有有关字符转化的问题当转化的目标类型是string或者wstring类型的时候,可以通过拷贝构造的方法达到不造成内存泄露的效果。

2、而当目标字符串是char*wchar*时很容易有内存泄露产生,对于那些需要长期运行的代码来说这绝对是要避免的,方法有:

法一:不通过调用函数的方式来实现,用完勿忘delete与把对应指针设置为NULL即可。

法二:通过调用函数的方式来实现时,传入的实参实现以new好内存,用完释放。

3、另外要注意某些字符的存储格式、如char[],char*

 

 

第四部分

问题:

1、webservice工程中为什么要把生成的json字符串转换成unicode,怎么知道json字符串刚开始是GBK的?

2、什么时候要用到WChar2Ansi呢?


注:本篇博文为自己学习过程的心得笔记,如有内容雷同,还请见谅,谢谢!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值