文本文件及二进制文件的大小, Unicode字符编码

今天看别人写的程序, 有一点不是很明白, 就是在mfc的程序中利用CFile在写文件时是怎么区别二进制文件和文本文件的.

首先说一下二进制文件和文本文件的区别:

从网上找到一篇文章, 写的挺基础, 通俗易懂的, 和大家分享:

 

 



现在搞懂了文本文件与二进制文件之间的关系啦.

我们可以利用二进制编辑器查看文本文件.


上图红框中的左边是十六进制显示的,右边是文本(ascii

在程序中有这么一句:

开始我不明白为什么要写两个字节的"fffe", 后才上网查了一下资料才发现,这与编码方式有关.

UTF的字节序和BOM

UTF-8以字节为编码单元,没有字节序的问题。UTF-16以两个字节为编码单元,在解释一个UTF-16文本前,首先要弄清楚每个编码单元的字节序。例如收到一个"奎"的Unicode编码是594E,"乙"的Unicode编码是4E59。如果我们收到UTF-16字节流"594E",那么这是"奎"还是"乙"?

Unicode规范中推荐的标记字节顺序的方法是BOM。BOM不是"Bill Of Material"的BOM表,而是Byte Order Mark。 BOM是一个有点小聪明的想法:在UCS编码中有一个叫做"ZERO WIDTH NO-BREAK SPACE"的字符,它的编码是FEFF。而FFFE在UCS中是不存在的字符,所以不应该出现在实际传输中。UCS规范建议我们在传输字节流前,先传输 字符"ZERO WIDTH NO-BREAK SPACE"。

这样如果接收者收到FEFF,就表明这个字节流是Big-Endian的;如果收到FFFE,就表明这个字节流是Little-Endian的。因此字符"ZERO WIDTH NO-BREAK SPACE"又被称作BOM。

UTF-8不需要BOM来表明字节顺序,但可以用BOM来表明编码方式。字符"ZERO WIDTH NO-BREAK SPACE"的UTF-8编码是EF BB BF。所以如果接收者收到以EF BB BF开头的字节流,就知道这是UTF-8编码了。

Windows就是使用BOM来标记文本文件的编码方式的。

———————————————————-

好了﹐这些问题解决后﹐我们就来做单纯的文本文件的编码识别﹐读取与写入测试吧。

以windows的notepad为例(其它的文本文件读取软件的原理应该也差不多﹐只是会多一些特殊的判断算法而已)。

notepad默认有四种编码来存储和读取文本文件。分别是﹕

ANSI,Unicode,Unicode-big-endian和UTF-8。

首先来讲ANSI吧﹐这个是windows操作系统在区域与语言块设置的编码(也就是系统默认的编码)﹐因此像繁体操作系统就是big5,而简体操作系统则是GBK

而Unicode和UTF-8这两种格式相信大家已经有所了解(当然前者是unicode-16)

而Unicode-big-endian是什么意思呢﹐它与Unicode几乎一样﹐只是它把高位放在前面(而后者则刚好相反)

上面的摘录已经有所说明﹐这里再解释一下﹕

如同样是字符"A"﹐在以下几种格式中的存储形式分别是﹕

UTF-16 big-endian : 00 41

UTF-16 little-endian : 41 00

UTF-32 big-endian : 00 00 00 41

UTF-32 little-endian : 41 00 00 00

好了﹐大家想一想﹐文本文件在硬盘中是以字节形式存储的﹐如果不知道文本文件的编码﹐那是无论如何也不能正确读出文本文件显示给用户看的(乱码了只有人才知道﹐程序则认为一切正常)

根据BOM的规则﹐因此在一段字节流开始时﹐如果接收到以下字节﹐则分别表明了该文本文件的编码。
UTF-8: EF BB BF

UTF-16 : FF FE

UTF-16 big-endian: FE FF

UTF-32 little-endian: FF FE 00 00

UTF-32 big-endian: 00 00 FE FF

而如果不是以这个开头﹐那程序则会以ANSI,也就是系统默认编码读取。

 

这儿具体介绍中文编码:http://www.cnblogs.com/xkfz007/articles/2566434.html

posted @ 2011-07-21 09:26  Mr.Rico  阅读(5912)  评论(0编辑  收藏  举报