重新认识UNICODE,UTF-8,多字节,代码页

时间:2023-01-06 14:51:54

1.UNICODE本身也提供了编码,被称为UCS,它最初在设计的时候对所有的字符统一采用至少2个字节,但是这对英文国家显然是个浪费。而且还存在大头序小头序的问题。

2.所谓大头序小头序,是指“字节序”,是“字节”这一级别的,(而不是“位”级别的,不是说高位在前还是低位在前的问题,对所有CPU,高位就是高位,低位就是低位),自然,只有多个字节作为逻辑上的一个整体交给CPU处理时,才会发生“字节序”的问题,比如一个整数0x2E2F用两个字节表示,不同的CPU平台在读写这个整数的时候可能就不同,有的把高位字节放在高位,于是值为0x2E2F,有的把低位字节放在高位于是值为0x2F2E。而UNICODE的编码系统UCS正是采用了使用“两个字节作为一个整体“作为编码值的方案,所以,假如说,UNICODE编码规定汉字“一”的编码是0x2E2F,汉字"二“的编码是0x2F2E,当某CPU平台A(采用小头序)把”一“(0x2E2F)传个某CPU平台B(采用大头序),B得到数据后会把其当作0x2F2E,于是找编码值0x2F2E对应的字符,即”二“,于是,”一“变成了”二“。这便是大头序小头序问题,其实这不是没有解决办法,只要UNICODE编码系统规定采用大头还是小头就可以了,可惜的是,UNICODE没有加以规定。

3.UTF-8解决了上述两个问题,这个编码系统的具体细则可参考:http://blog.csdn.net/dyzhen/article/details/7448529。

简单说,UTF-8的编码值不再把”两个字节“作为一个整体,而是单个字节独立,每个字节中都会有几位作为标志位,用来标志左右相邻的哪些个字节作为一个”组合“,该”组合“的值便是编码值。它用一个字节为ASCII中的字符编码,因此解决了浪费问题;而每个字节独立,又解决了大头序小头序的问题。

4.UTF-8与ANSI一样,它跟UNICODE之间,在VC编程上,是对等的,也就是说UTF-8在这个时候来讲,不属于UNICODE

5.vc的函数只能支持UNICODE或MBCS,而不能支持UTF-8,所以无法直接显示一个UTF-8的字符串,如果要显示,要么把它转化为UNICODE,要么转化为ANSI

6.MySQL的函数在使用的时候通过mysql_set_character_set(,,,"utf8"),指定了本连接过程的发送和返回数据都是采用UTF-8的编码,如果要在VC中显示返回的内容,则,要么把它转化为UNICODE,要么转化为MBCS

7.UTF-8跟ANSI一样,都作为一个代码页,可参考WideCharToMultiByte函数的MSDN说明

8.对于string,char*,如果指定了字符编码是UTF-8,那么它们的内容就是按UTF-8编码的;而wstring无论在何时都是UNICODE编码

9、编码,它不仅是种协议,还包括具体的实现系统,因为计算机无论如何只能处理01,说白了,编码就是为人类的语言字符在计算机的世界里编个代号,这个代号依然是01