文件头二个字节是什么意思啊?急!!

xieaqiang 2012-01-08 01:33:22
看网上说, 判断文件的编码 取文件头二个字节判断就行了, 怎么取文件头二个字节? 我用OPEN读入文件后,直接就显示内容了, 看不到字节啊, 怎么判读txt文件编码呢,是UTF8还是GBK, 求个例子,感谢。
...全文
545 13 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
「已注销」 2012-01-09
  • 打赏
  • 举报
回复
不同的文件,其文件头可能存在文件类型标识(不是绝对的),一般文件头打开以二进制方式打开:
1)使用CreateFile以二进制只读方式打开文件;大致形式如下:
HANDLE hFile = CreateFile(FileName, GENERIC_READ, FILE_SHARE_READ, NULL,OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if(hFile == INVALID_HANDLE_VALUE) return bReturnVal;
2)使用ReadFile读取文件头两个字节(最好多读几个字节),大致形式如下:
ReadFile(hFile, buffer, READBUF_SIZE, &ReadBytes, NULL)
3)使用CloseHandle关闭打开的文件
4)由buffer直接判断类型
我只会用Windows API,程序细节可以查手册

常见文件类型如下:
SWF文件:头3个字节为SWF或CWF
WAV文件:头4个字节为RIFF
... 所以不一定是2个字节,最好结合后缀一起判断
sichuanwww 2012-01-08
  • 打赏
  • 举报
回复
用UE等打开,然后用二进制方式查看,这个头是不可见字符.用来标识文件头
Eleven 2012-01-08
  • 打赏
  • 举报
回复
http://www.codeproject.com/KB/files/ANSI-UNICODE_conversion.aspx
oyljerry 2012-01-08
  • 打赏
  • 举报
回复
用UE等打开,然后用二进制方式查看,这个头是不可见字符.用来标识文件头
schlafenhamster 2012-01-08
  • 打赏
  • 举报
回复

// CEditStringDoc serialization
void CEditStringDoc::Serialize(CArchive& ar)
{
BOOL FirstLine=TRUE;
WCHAR wBuf[2048];
char szBuf[2048];
int i=0;
BOOL LineEnd=FALSE;
char type[10];
char dummy[10];
char *pLine=0;
char UniHead[4]={(char)0xEF,(char)0xBB,(char)0xBF,(char)0};
char UtfHead[3]={(char)0xFF,(char)0xFE,(char)0};
/*
EF BB BF    UTF-8
FE FF     UTF-16/UCS-2, little endian
FF FE     UTF-16/UCS-2, big endian
FF FE 00 00  UTF-32/UCS-4, little endian.
00 00 FE FF  UTF-32/UCS-4, big-endian.
*/
CFile *pFile=ar.GetFile();
CString name=pFile->GetFileTitle();//
if((name.Find(".htm")==-1) && (name.Find(".txt")==-1))
{
AfxMessageBox("Only suports *.htm or *.txt files!");
return;
}
//
memset(type,0,10);
memset(dummy,0,10);
//
if (ar.IsStoring())
{
// TODO: add storing code here
int all=m_TextArray.GetSize();
for (int kk=0;kk<all;kk++)
{
strcpy(szBuf,m_TextArray[kk].GetBuffer(2048));
strcat(szBuf,"\r\n");
if(FirstLine)
{
if (m_UTF8) ar.Write(UniHead,3);
else if (m_UNICODE) ar.Write(UtfHead,2);
}// end 1st line
if(m_UTF8)
{
MultiByteToWideChar(CP_ACP,0,szBuf,-1,wBuf,2048);
WideCharToMultiByte(CP_UTF8,0,wBuf,-1,szBuf,2048,0,0);
ar.Write(szBuf,strlen(szBuf));
}
if(m_UNICODE)
{
MultiByteToWideChar(CP_ACP,0,szBuf,-1,wBuf,2048);
ar.Write(wBuf,2*wcslen(wBuf));
}
else
{
ar.Write(szBuf,strlen(szBuf));
}
FirstLine=FALSE;
}// end for
}// end save
else
{// if UTF8 file the 1st 3 chars are: EFh,BBh,BFh
// if UNICODE file the 1st 2 chars are :FFh,FEh
// TODO: add loading code here
m_TextArray.RemoveAll();
memset(szBuf,0,sizeof(szBuf));
while(ar.Read(&szBuf[i],1))
{//
if(FirstLine)
{
if( (szBuf[0]!=(char)0xEF) &&
(szBuf[0]!=(char)0xBB) &&
(szBuf[0]!=(char)0xBF) &&
(szBuf[0]!=(char)0xFF) &&
(szBuf[0]!=(char)0xFE) )
{// normal file
m_UTF8=FALSE;
m_UNICODE=FALSE;
FirstLine=FALSE;
i++;
continue;
}
if( szBuf[0]==(char)0xEF)
{
type[0]=szBuf[0];
continue;
}
if( szBuf[0]==(char)0xBB)
{
type[1]=szBuf[0];
continue;
}
if( szBuf[0]==(char)0xBF)
{
type[2]=szBuf[0];
}
// Is UTF8 file ?
if( (type[0]==(char)0xEF) &&
(type[1]==(char)0xBB) &&
(type[2]==(char)0xBF) )
{// UTF8 file
m_UTF8=TRUE;
m_UNICODE=FALSE;
FirstLine=FALSE;
continue;//i=0
}
// Is UNICODE file ?
if( szBuf[0]==(char)0xFF)
{
type[0]=szBuf[0];
continue;
}
if( szBuf[0]==(char)0xFE)
{
type[1]=szBuf[0];
}
if( (type[0]==(char)0xFF) &&
(type[1]==(char)0xFE) )
{
m_UNICODE=TRUE;
m_UTF8=FALSE;
FirstLine=FALSE;
continue;//i=0
}
}// end firstline
// check line end
if(szBuf[i]==0x0D)
{//
LineEnd=TRUE;
szBuf[i]=0;
ar.Read(dummy,1);//00 or 0a
if(m_UNICODE)
{
szBuf[i+1]=0;
ar.Read(dummy,2);//0a 00
}
}
//
if(LineEnd)
{
if(m_UTF8)
{// utf8 file
MultiByteToWideChar(CP_UTF8,0,szBuf,-1,wBuf,2048);
WideCharToMultiByte(CP_ACP,0,wBuf,-1,szBuf,2048,0,0);
pLine=szBuf;
}
else if(m_UNICODE)
{// Unicode file
WideCharToMultiByte(CP_ACP,0,(WCHAR *)szBuf,-1,(char *)wBuf,2048,0,0);
pLine=(char *)wBuf;
}
else
{// normal file
pLine=szBuf;
}
LineEnd=FALSE;// new line
i=-1;// +1=0 szBuf[0]
//add
m_TextArray.Add(pLine);
memset(szBuf,0,sizeof(szBuf));
}// end LineEnd
i++;//from 0
}// end while
// if file end but no LF
if(szBuf[0]!=0) m_TextArray.Add(szBuf);// last line
if(m_TextArray.GetSize()!=0)
{
UpdateAllViews(0);
}
}
}

quwei197874 2012-01-08
  • 打赏
  • 举报
回复
十十[Quote=引用 3 楼 schlafenhamster 的回复:]

/*
EF BB BF    UTF-8
FE FF     UTF-16/UCS-2, little endian
FF FE     UTF-16/UCS-2, big endian
FF FE 00 00  UTF-32/UCS-4, little endian.
00 00 FE FF  UTF-32/UCS-4, big-endian.
*/
[/Quote]
schlafenhamster 2012-01-08
  • 打赏
  • 举报
回复
/*
EF BB BF    UTF-8
FE FF     UTF-16/UCS-2, little endian
FF FE     UTF-16/UCS-2, big endian
FF FE 00 00  UTF-32/UCS-4, little endian.
00 00 FE FF  UTF-32/UCS-4, big-endian.
*/
用户 昵称 2012-01-08
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 schlafenhamster 的回复:]
/*
EF BB BF    UTF-8
FE FF     UTF-16/UCS-2, little endian
FF FE     UTF-16/UCS-2, big endian
FF FE 00 00  UTF-32/UCS-4, little endian.
00 00 FE FF  UTF-32/UCS-4, big-endian.
*/
[/Quote]
俺怎么脚着反了呢。
用户 昵称 2012-01-08
  • 打赏
  • 举报
回复
2,3,4字节都有可能是bom头。
schlafenhamster 2012-01-08
  • 打赏
  • 举报
回复
用“记事本”打开一个.txt,按不同编码保存。
再用UE看看。
战在春秋 2012-01-08
  • 打赏
  • 举报
回复
楼主可以把示例中的文件名改成自己的文件名。
战在春秋 2012-01-08
  • 打赏
  • 举报
回复
应该以二进制方式打开文件。以下为示例代码:
#include <string>
#include <iostream>
#include <fstream>
#include <windows.h>

using namespace std;

void main()
{
string filename = "c:\\Default.asp";
ifstream fin( filename.c_str(),ios::binary);

if(!fin)
{
cout << "打开文件"<< filename << "出错" << endl;
exit(-1);
}
else
{
byte bytes[3];
fin.read((char *)&bytes,sizeof bytes);
if(bytes[0] == 0xEF&& bytes[1] == 0xBB && bytes[2] == 0xBF)
{
cout <<"UTF8"<<endl;
}else
{
cout <<"GB2312"<<endl;
}
}
fin.close();

}
fa1188 2012-01-08
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 sichuanpb 的回复:]
用UE等打开,然后用二进制方式查看,这个头是不可见字符.用来标识文件头
[/Quote]

用UE 打开了, 文件看不到有头信息啊, 其它文件都能看到。

16,548

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧