• 文本文件及二进制文件的大小, 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

  • 相关阅读:
    ajax与Servlet
    Myeclipse快捷键的设置以及默认的编码格式
    bootstrap02导航菜单
    bootstrap01登录小例子
    ajax
    面向对象04异常
    mysql
    Day10 Python基础之特殊函数(八)
    Day9 Python基础之函数基础(七)
    Day8 Python基础之遗漏知识点(六)
  • 原文地址:https://www.cnblogs.com/xkfz007/p/2176994.html
Copyright © 2020-2023  润新知