7305|21

53

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

读取文本文件 [复制链接]

我现在有段代码能读取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);
复制代码

最新回复

我这读了还要对里面的字符一个操作, 比如说计算宽度,换行换页等.. 不光只是读出来而已.   详情 回复 发表于 2008-7-11 09:39
点赞 关注

回复
举报

69

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
用wfopen,是fopen的宽字符版本。
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
如果是Unicode,文件的前两个字节是标识位。具体是什么,可以UE看看,好像是0xff和0xfe。

显示的时候,过滤此两个字符,应该可以正常显示的。
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

4
 
如果直接读,除了0xFF 0xFE表示Unicode,还有0xFE 0xFF表示UTF-8。
其实,你用记事本(NotePad)保存普通文本,另存Unicode文本,Utf-8文本,然后用UltraEdit之类的以16进制方式打开,就能看到开始的差别了。
 
 
 

回复

82

帖子

0

TA的资源

一粒金砂(初级)

5
 
读是都可以读,但是显示的时候要根据文件头判断字符编码格式,然后用MultiByteToWideChar转换
 
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

6
 
[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);
复制代码

就这段代码作如何更改.
 
 
 

回复

57

帖子

0

TA的资源

一粒金砂(初级)

7
 
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有可能返回不正确的结果。
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

8
 
你的代码其实就是在CString text=pdata;
时把char*转换成了unicode而已。

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

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

回复

86

帖子

0

TA的资源

一粒金砂(初级)

9
 
http://yangwei.blogbus.com/
一些基本知识。
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

10
 
引用 7 楼 lenux 的回复:
你的代码其实就是在CString text=pdata;
时把char*转换成了unicode而已。

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

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


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


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

 
 
 

回复

64

帖子

0

TA的资源

一粒金砂(初级)

11
 
先判断是ASCII还是UNICODE,然后用fopen, 或者 wfopen
 
 
 

回复

61

帖子

0

TA的资源

一粒金砂(初级)

12
 
你们这说的我都在网上看过了.
能不能就我代码本身提点建议啊.
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

13
 
打开文件
用byte *读入两个字符,
按上述规则判断

1、unicode
按TCHAR*读入

2、ascII
按char*读入就行。
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

14
 
前面这两个字体要怎么去掉呢.
不去掉会有个乱码出现...
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

15
 
同一段代码在第一页读取是正常的, 第二页再调用这段代码来读取就是乱码了.
这是怎么回事啊?

还有我这有个判断是否是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
 
 
 

回复

64

帖子

0

TA的资源

一粒金砂(初级)

16
 
路过,我们搞linux的
 
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

17
 
什么是第一页第二页的?

整个文件就头上几个字节需要处理啊。
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

18
 
我这要分页显示啊.
电子书功能啊.
  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的代码.
第一页能显示.第二页调用这段代码就显示不了了.
 
 
 

回复

64

帖子

0

TA的资源

一粒金砂(初级)

19
 
长度*2也没用...
 
 
 

回复

55

帖子

0

TA的资源

一粒金砂(初级)

20
 
file.Close();
后再去读没有重新打开文件啊。

Seek

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

一个好的编程习惯会让你的调试容易。
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表