由于之前没有对Unicode文件的读写写过代码,对其了解甚少,今天搞了一天Unicode文件的读写,现在终于明白了好多问题,跟大家分享一下吧。
至于Unicode编码的定义我就不说了,自己查资料去吧。
以Unicode编码的文件开头的两个字节(即第一个字符)是硬性规定的,即0xfeff(还有一种Unicode编码文件的是0xfffe,这里先不介绍),故大家在读文件头的时候可以据此判断该文件是不是Unicode编码的文件.
当我把文件的内容读到一个WCHAR变量数组的里时,第一个元素就是0xfeff,该文件的实际内容是从第二个元素开始的,这个我开始不知道,弄得我头疼了半天,后来通过调试并监视数据终于知道了。下面给一个我写的有关读取Unicode和ansi编码文件的小程序代码:
void CUnicode文件读写Dlg::OnBnClickedOk()
{
// 读Unicode编码的文件
WCHAR FileName[128];
wcscpy_s(FileName,_countof(FileName),_T(""));
GetCurrentDirectory(128,FileName);
wcscat_s(FileName,_countof(FileName),_T("//Data//Unicode.txt")); // 该文件的内容为"Hello 中国,中华人民共和国 Good"
CFile file(FileName,CFile::modeCreate |
CFile::modeNoTruncate | CFile::typeBinary |
CFile::modeReadWrite | CFile::shareDenyNone);
WCHAR FileContent[10];
wcscpy_s(FileContent,_countof(FileContent),_T(""));
file.Seek(0,CFile::begin); // 如果只需要文件中的实际内容,可以从第三个字节开始读取,即"file.Seek(2,CFile::begin);",不能为"file.Seek(1,CFile::begin);",否则会出现乱码
file.Read(FileContent,18); // 第二个参数为读取18字节(即9个字符,包括了第一个字符0xfeff,实际有用的为后8个字符)
FileContent[9]='/0'; // 如果文件后方还有其他字符,需要添加结束字符'/0'
int size=wcslen(FileContent); // 得到的长度为9个字符,但实际上你能看见的只有8个字符,这里让我郁闷了半天,这里明白了后面就很容易理解了
WCHAR ch[50]; // 每一个元素为两个字节,即该数组占用了100个字节
wcscpy_s(ch,_countof(ch),_T("Hello 中国,中华人民共和国"));
int chLen=wcslen(ch); // 该值等于16
int readLen=wcslen(FileContent); // 该值为9
int ret = wcsncmp(&FileContent[1],ch,readLen-1); // 对前8个字符进行比较,这里需要从第二个元素开始比较
long asc=(long)FileContent[0]; // 取第一个元素,验证是否为0xfeff,即Unicode编码文件的标志
if(asc==0xfeff)
{
// Do something
MessageBox(_T("OK!")); // 程序将出现OK对话框
}
else
{
// Do something
MessageBox(_T("No!"));
}
}
void CUnicode文件读写Dlg::OnBnClickedButton1()
{
// 读取ANSI编码的文件
WCHAR FileName[128];
wcscpy_s(FileName,_countof(FileName),_T(""));
GetCurrentDirectory(128,FileName);
wcscat_s(FileName,_countof(FileName),_T("//Data//Ansi.txt")); // 该文件内容为“Hello 中国,中华人民共和国”
char FileContent[50]="";
CFile file(FileName,CFile::modeCreate |
CFile::modeNoTruncate | CFile::typeBinary |
CFile::modeReadWrite | CFile::shareDenyNone);
file.Seek(0,CFile::begin);
file.Read(FileContent,16);
int size=strlen(FileContent);
}