2012-04-19 20:07112 人阅读评论(0)收藏举报 VC ANSI 环境下按行读取ANSI、UNICODE 、UNICODE big en dian 、UTF-8 四种文本文件 1.问题提出 MFC 提供的文件类 CStdioFile,其中一个函数 ReadString 实现了文件的按行读取,但是不能满足不同类型的文本文件的按行读取,为了解决这一问题,笔者初步研究了一些编码知识,参考了网上的一些资料,实现了 CStdioFile 类的扩展类 CStdioFileEx,完成了常见文本文件的按行读取(注明:不包括 DOC、PDF 等其他形式的文档). 在此对网上分享编码经验的网友表示感谢,同时由于我编写的类还未经过严格测试,如有错误或方法过于复杂敬请各位指正。 2.问题解决 (1)四种常见文本文件编码方式研究 ANSI、UNICODE 、UNICODE big en dian 、UTF-8 四种格式编码存在差别,简要介绍如下: ANSI 编码: 无文件头(文件编码开头标志性字节) ANSI 编码字母数字占一个字节,汉字占两个字节, 回车换行符单字节 十六进制表示为 0d 0a UNICODE 编码: 文件头,十六进制表示为 FF FE 每一个字符都用两个字节编码 回车换行符 双字节 000d 000a Unicode big endian 编码: 文件头十六进制表示为 FE FF , 后面编码是把字符的高位放在前面,低位放在后面,正好和 Unicode 编码颠倒。 回车换行符,双字节,十六进制表示为 0d00 0a00 UTF-8 编码: 文件头,十六进制表示为 EF BB BF。 UTF-8 是 Unicode 的一种变长字符编码,数字、字母、回车、换行都用一个字节表示,汉字占 3 个字节. 回车换行符,单字节,十六进制表示为 0d 0a 以中文"你好"二字为例,各种类型的编码对应的十六进制格式(可由 EditPlus 查看)如下图所示: 由此可见上述的探讨是正确的。 (2)按行读取上述四种格式文本文件的解决方案 针对不同文件编码的特点,通过先检测文件头判断文件编码类型,然后根据文件类型分别调用不同的读取函数实现文件的按行读取。按行读取过程如下图所示: 实现过程中,编写 CStdioFileEx 类,该类继承自 CStdioFile 类,覆盖了 CStdioFile 类的BOOL ReadString(CString&rString)方法,从而实现了文件按行读取。 (3)CStdioFileEx 类的实现代码 代码清单: [cpp]view plaincopyprint? 1. // StdioFileEx.h: interface for the CStdioFileEx class. 2. // 3. //////////////////////////////////////////////////////////////////////...