VC UNICODE UTF8 ANSI编码转换的疑问

The fool 2012-04-17 09:46:52
想实现UNICODE、UTF8、ANSI、UTF Big endian 文件的按行读取,基本思路是:
根据

文件头 换行符
EF BB BF: UTF-8 回车换行符 单字节 0d 0a
FF FE:UNICODE 回车换行符 双字节 000d 000a
FE FF :UTF-16/UCS-2, big endian 回车换行符 双字节 0d00 0a00
ANSI:无文件头 回车换行符 单字节 0d 0a


检测文件类型,然后根据每种编码判断回车换行,按行读取。

实现函数代码如下:
CString CReadStringDlg::ReadstringFromFile(CString filepath,long linecnt)
{
CFile file(m_strPath, CFile::modeRead|CFile::shareDenyNone);
long index,cnt;
CString strRead;
wchar_t wchcr;//不同编码回车换行符
wchar_t wchlf;
int offset;
wchar_t wChLine[300];//存放每行字符
wchar_t wchtemp[2];//存放临时读取字符
TextCode tc=CheckTextFileType(m_strPath);
//每种编码的回车换行符各不相同
switch(tc)
{
case ANSI:
return ReadstringFromAnsiFile(filepath,linecnt);//ANSI文件读取已通过
case UNICODE:
offset=2*sizeof(byte);
wchcr=MAKEWORD(0x0d,0x00);//MakeWord(低、高字节顺序)
wchlf=MAKEWORD(0x0a,0x00);//UNICODE按行读取已经通过
break;
case UNICODEBIGENDIAN:
offset=2*sizeof(byte);
wchcr=MAKEWORD(0x00,0x0d);
wchlf=MAKEWORD(0x00,0x0a);
break;
case UTF8:
return ReadstringFromAnsiFile(filepath,linecnt);//当做ANSI文件来读取
}
//不同文件头 文件指针偏移不同
file.Seek(offset,CFile::begin );
cnt=0;
while(cnt<linecnt)
{
index=0;
while(TRUE)
{
file.Read(wchtemp,sizeof(wchar_t)*2);
wChLine[index++]=wchtemp[0];
wChLine[index++]=wchtemp[1];
//判断回车换行
if(wchtemp[0]==wchcr && wchtemp[1]==wchlf)
break;
//文件结束符
if(wchtemp[0]==0 && wchtemp[1]==0)
break;
}
wChLine[index]=0;
CString strtemp(wChLine,index);
strRead+=strtemp;
cnt++;
}
return strRead;
}

现在的问题是:
ANSI、UNICODE按行读取已经通过,
但是UNICODE Big endian和UTF8没有通过.

网上很多编码转换的,是我的思路错误,还是需要编码转换?
请指教!
...全文
309 3 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
lixiao_445 2012-04-18
  • 打赏
  • 举报
回复
先判读有没有BOM,如果有,先跳过去。
用户 昵称 2012-04-18
  • 打赏
  • 举报
回复
你已经获得了文件的格式,那么在转换时,还要去掉bom头才能正确转换编码。

16,548

社区成员

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

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

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