1.三种字符集:
a.单字符字符集,使用一个字节表示字符,如ASCII
b.多字节字符集,根据需要使用1个或多个字节,如GB2312
c.UNICODE,统一使用2个字节进行编码
2.GB2312(1980年)一共收录了7445个字符,包括6763个汉字和682个其它符号。汉字区的内码范围高字节从B0-F7,
低字节从A1-FE,占用的码位是72*94=6768。其中有5个空位是D7FA-D7FE。GB2312支持的汉字太少。1995年的
汉字扩展规范GBK1.0收录了21886个符号,它分为汉字区和图形符号区。汉字区包括21003个字符
3.从ASCII、GB2312到GBK,这些编码方法是向下兼容的,即同一个字符在这些方案中总是有相同的编码,后面的标准支持更多的字符。
在这些编码中,英文和中文可以统一地处理,中文两个字节,英文一个字节。GB2312、GBK都属于多字节字符集。
4.nANSI字符集:ASCII字符集,以及由此派生并兼容的字符集,如:GB2312,正式的名称为MBCS(Multi-Byte Chactacter System,
多字节字符系统),通常也称为ANSI字符集。
5.UNICODE与UTF8,UTF16
标准的Unicode称为UTF-16(UTF:UCS Transformation Format )。后来为了双字节的Unicode能够在现存的处理单字节的系统上正确传输,
出现了UTF-8,使用类似MBCS的方式对Unicode进行编码。(Unicode字符集有多种编码形式)
为什么还要有UTF-8?
毕竟互联网70%以上的信息仍然是英文。如果连英文都用2个字节存取(UCS-2),空间浪费不就太多了?所谓UTF-8就是这样一个为了提高
英文存取效率的字符集转换格式:Unicode Transformation Form 8-bit form。用UTF-8,UNICODE的2字节字符用变长个(1-3个字节)表示:
对英文,仍然和ASCII一样用1个字节表示,这个字节的值小于128(/x80);
对其他语言的用一个值位于128-256之间的字节开始,再加后面紧跟的2个字节表示,一个字符一共是3个字节;
因此,在应用中程序处理过程中所有字符都是16位(双字节),但在存取转换成字节流时使用UTF-8格式转换,对于英文字符来说和原来
用ASCII方式存取时相比大小仍然是一样的,而对中文来说和原来的GB2312编码方式相比,大小为:(3字节/2字节)=1.5倍
例如“联通”两个字的Unicode标准编码UTF-16 (big endian)为:DE 8F 1A 90
而其UTF-8编码为:E8 BF 9E E9 80 9A
当一个软件打开一个文本时,它要做的第一件事是决定这个文本究竟是使用哪种字符集的哪种编码保存的。软件一般采用三种方式来决定文本的字符集和编码:
1.检测文件头标识,2.提示用户选择,3.根据一定的规则猜测
最标准的途径是检测文本最开头的几个字节,开头字节 Charset/encoding,如下表:
EF BB BF UTF-8
FE FF UTF-16/UCS-2, little endian
FF FE UTF-16/UCS-2, big endian
FF FE 00 00 UTF-32/UCS-4, little endian.
00 00 FE FF UTF-32/UCS-4, big-endian.
但是早期的一些软件并没有自动给文件添加这些头部,这样会导致程序需要”猜“是什么编码,但是notepad会认为utf-8方式下存的文件更象一个ansi的,
于是用uansi来解析这个文件,这样会导致“联通”不能显示
UTF8和UNICODE字符是一一对应的,可以用很简单的算法进行转化。
6.项目的字符属性可以选择UNICODE和多字节,使用UNICODE则定义了_UNICODE 宏,多字节定义了_MBCS宏。
定义_UNICODE宏时,sizeof(_T("abc中"))为10
sizeof("abc中")为6
说明即使定义_UNICODE宏,还是要使用_T()才可以把字符编码成UNICODE
7.CString strTemp = "abc"在使用UNICODE字符集下出错,因为CString在unicode下使用宽字节wchar_t存放字符(两个字节)
而"abc"是多字节字符,无法进行默认转换,改成以下两个之一即可:
CString strTemp = _T("abc");
CString strTemp = (wchar_t *) "abc";
或使用多字节字符集也可,此时CString 中保存的串是多字节的。
8.char p[]/*p = "a中";
printf("%s",p);//正常输出
printf("%c",a[0]);//正常输出
printf("%c",a[1]);//不能正常输出,只取其中的前半截码,因为char一次只能取一个字节
9.对三种字符集有不同的串处理函数:
ASCII:str***
UNICODE:wcs***
MBCS:_mbs***
_tcs可以智能适用,一般用它
10.UNICODE版本的程序可以在任何语言的NT操作系统下运行(9X以上就是NT),而MBCS要装对应编码方式才可以显示
11.NT系统的内核都是UNICODE的。
12.在文本中敲入"df",保存正UNICODE编码,则文本头会加入FF FE两个字节,标示全篇是UNICODE编码的,用UE的二进制可以看出来,
参见5(有些老文本软件不会加标示头),保存成多字节编码的时候是不会加标示头的,多字节每个字的第一个字节的范围可以
标示编码。
13.流包括文件流,网络流等,文件流包括字符文件流和字节文件流,前者按字符的各种编码从操作文件中一个个字符(包括转义,比如读到一个'0x0a'再写出来就是一个换行),
后者操作文件中一个个字节。
二进制文件:所有文件的存储其实质都是二进制的,二进制文件往往由两部分组成,一部分是文件头另一部分存放了文件的内容。文件头通常存放与文件格式有关的信息,
以BMP等图象文件为例,它们的文件头中存放了是何种图形格式、图象大小、调色板等信息,要显示图象时先读取文件头以获得文件的详细信息,然后再按其格式把图象内容显示出来。
用二进制方式可以操作任何的文件,当然至关重要的一点是要清楚了解所操作文件的文件头结构。
CFile只能以二进制方式操作文件,CStdioFile可以用二进制和文本方式操作文件,CFile中并没有提供读取和写入一行的操作,因为在二进制文件中,'0x0D0x0A'并不一定是回车换行
只有这个二进制文件存放的是文本时才是回车换行,存放一个图像,视频时就不是,而CFile要提供公共的对于二进制文件的处理方法,就不可能操作一个文本文件的行。
可以用二进制方式操作文本文件,二进制方式可以操作任何文件,但是以文本方式操作文本文件更方便,比如CStdioFile操作文本比CFile就更方便。
一般不用文本方式操作其他非文本二进制文件.