读取文本文件

fujike029   2008-7-1 18:57 楼主
我现在有段代码能读取ANSI编码方式的文本,可是UNICODE编码的文本却是打不开.
现在我想要既能读ANSI又能读UNICODE.
各位有什么办法不.
  1.         CFile file;
  2.         TCHAR* szMsg = new TCHAR[100];
  3.         szMsg = m_FullFileName.GetBuffer(m_FullFileName.GetLength());


  4.         if(!file.Open(m_FullFileName,CFile::modeRead,NULL))
  5. //        if(!file.Open(szMsg,CFile::modeRead,NULL))
  6.         return;

  7.         CDC * pdc=this->GetDlgItem(IDC_Text)->GetDC();
  8.         unsigned char * pdata;
  9.         pdata=(unsigned char *)malloc(LENGTH_READ_ONCE+10);
  10. //         TCHAR* pdata;
  11. //         pdata=(TCHAR*)malloc(LENGTH_READ_ONCE+10);

回复评论 (21)

用wfopen,是fopen的宽字符版本。
点赞  2008-7-1 22:02
如果是Unicode,文件的前两个字节是标识位。具体是什么,可以UE看看,好像是0xff和0xfe。

显示的时候,过滤此两个字符,应该可以正常显示的。
点赞  2008-7-1 23:02
如果直接读,除了0xFF 0xFE表示Unicode,还有0xFE 0xFF表示UTF-8。
其实,你用记事本(NotePad)保存普通文本,另存Unicode文本,Utf-8文本,然后用UltraEdit之类的以16进制方式打开,就能看到开始的差别了。
点赞  2008-7-2 09:13
读是都可以读,但是显示的时候要根据文件头判断字符编码格式,然后用MultiByteToWideChar转换
点赞  2008-7-2 09:17
[uote=引用 4 楼 Reallyu 的回复:]
读是都可以读,但是显示的时候要根据文件头判断字符编码格式,然后用MultiByteToWideChar转换
[/quote]

我在网上找了下,大多是这种做法,可是要一个一个去转换吗?我还找到一个可以读取UNICODE的类.可是呢, 是在VC++下写的.
  1. CFile file;
  2.                 if(!file.Open(m_FullFileName,CFile::modeRead,NULL))
  3.                         return;

  4.                 unsigned char * pdata;
  5.                 pdata=(unsigned char *)malloc(LENGTH_READ_ONCE);

  6.                 memset(pdata,0,LENGTH_READ_ONCE);
  7.                 file.Seek(pagestart[m_CurPage],SEEK_SET);
  8.                 file.Read(pdata,LENGTH_READ_ONCE);
  9.                 file.Close();

  10.                 pdata[pageend[m_CurPage]-pagestart[m_CurPage]+1]=0;
  11.                 CString text=pdata;
  12.                 m_Text.SetWindowText(text);

就这段代码作如何更改.
点赞  2008-7-2 09:40
ANSI:        无格式定义;

对于Unicode,几种编码的BOM如下:

UTF-32, big-endian 文件的前4个byte是:00 00 FE FF
UTF-32, little-endian文件的前4个byte是:FF FE 00 00
UTF-16, big-endian文件的前2个byte是:FE FF
UTF-16, little-endian文件的前2个byte是:FF FE
UTF-8文件的前3个byte是:EF BB BF
UTF-7的规律特殊一点,不是前几个byte,而是所有的byte转换为十进制都小于127。

一般来说
判断如果文本文件的开头两个字节是0xFF和0xFE和0xEF,那么就是Unicode,否则是ANSI。
UTF-32的比较少。

如何判断一段字符串是ANSI还是Unicode?
用IsTextUnicode进行判断。IsTextUnicode使用一系列统计方法和定性方法,以便猜测缓存的内容。由于这不是一种确切的科学方法,因此 IsTextUnicode有可能返回不正确的结果。
点赞  2008-7-2 09:55
你的代码其实就是在CString text=pdata;
时把char*转换成了unicode而已。

你要真正理解unicode和ascII的含义,就是字节上的一些变化。

所以自己写吧。入门必需的。
点赞  2008-7-2 10:04
http://yangwei.blogbus.com/
一些基本知识。
点赞  2008-7-2 10:06
引用: 引用 7 楼 lenux 的回复:
你的代码其实就是在CString text=pdata;
时把char*转换成了unicode而已。

你要真正理解unicode和ascII的含义,就是字节上的一些变化。

所以自己写吧。入门必需的。


你的意思是我在CString text=pdata;
这里把ANSI编码转换成了UNICODE编码?
可是我现在只能打开ANSI编码的文本文件.


m_Text.SetWindowText(text);
这是个STATIC控件.

点赞  2008-7-2 10:28
先判断是ASCII还是UNICODE,然后用fopen, 或者 wfopen
点赞  2008-7-2 10:31
你们这说的我都在网上看过了.
能不能就我代码本身提点建议啊.
点赞  2008-7-2 11:25
打开文件
用byte *读入两个字符,
按上述规则判断

1、unicode
按TCHAR*读入

2、ascII
按char*读入就行。
点赞  2008-7-2 13:11
前面这两个字体要怎么去掉呢.
不去掉会有个乱码出现...
点赞  2008-7-5 09:26
同一段代码在第一页读取是正常的, 第二页再调用这段代码来读取就是乱码了.
这是怎么回事啊?

还有我这有个判断是否是UNICODE编码.
  1.                 file.Read(&buffer,sizeof(WORD));
  2.                 if (buffer != 0xFEFF)
  3.                 {
  4.                         bIsUnicode= false;
  5.                 }
  6.                 else
  7.                 {
  8.                         bIsUnicode= true;
  9.                 }


UTF-16返回的是true,而UTF-8却是false
点赞  2008-7-5 16:48
路过,我们搞linux的
点赞  2008-7-6 00:14
什么是第一页第二页的?

整个文件就头上几个字节需要处理啊。
点赞  2008-7-7 10:21
我这要分页显示啊.
电子书功能啊.
  1. if(bIsUnicode)
  2.                 {
  3.                         TCHAR* punicode=(TCHAR *)malloc(LENGTH_READ_ONCE);
  4.                         memset(punicode,0,LENGTH_READ_ONCE);
  5.                         file.Seek(pagestart[m_CurPage],SEEK_SET);
  6.                     file.Read(punicode,LENGTH_READ_ONCE);
  7.                         file.Close();
  8.                         punicode[pageend[m_CurPage]-pagestart[m_CurPage]+1]=0;

  9.                         CString text1=punicode;
  10.                     m_Text.SetWindowText(text1);

  11.             free(punicode);

  12.                 }



这是读UNICODE的代码.
第一页能显示.第二页调用这段代码就显示不了了.
点赞  2008-7-7 20:48
长度*2也没用...
点赞  2008-7-7 20:52
file.Close();
后再去读没有重新打开文件啊。

Seek

Read
后都要去判断是否成功,失败了错误码是什么,

一个好的编程习惯会让你的调试容易。
点赞  2008-7-8 13:01
12下一页
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复