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没有通过.

网上很多编码转换的,是我的思路错误,还是需要编码转换?
请指教!
...全文
304 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
lixiao_445 2012-04-18
  • 打赏
  • 举报
回复
先判读有没有BOM,如果有,先跳过去。
用户 昵称 2012-04-18
  • 打赏
  • 举报
回复
你已经获得了文件的格式,那么在转换时,还要去掉bom头才能正确转换编码。
开源项目TinyXml项目所涉及的字符编码说明如下: 1. TinyXml函数调用接口的字符型参数,仅支持`窄字符`格式(char*),不兼容`宽字符`格式(wchar_t*)。 2. TinyXml函数提供的Xml内容解析功能,仅支持以ANSI编码UTF8编码的Xml字符串,也即`多字节编码`。 3. TinyXml函数提供的Xml内容解析功能,不支持内容以UTF16编码和UTF32编码的Xml字符串,也即`Unicode编码`。 4. UTF8编码Unicode编码的一种实现方式,以不定个数的字节来存储一个Unicode码值,支持多国语言文字。 也即,UTF8编码编码实现上属于`多字节编码`,在编码标准上属于`Unicode编码`。 5. 人类语言中同一个的字符,如果在各种不同的标准如ANSI编码UTF8编码、UTF16编码和UTF32编码中都存在码值, 就可以相互转换。因为各个标准下的可编码字符容量不同,部分语言字符会在一个编码标准库下存在, 而在另外一个编码标准库下不存在,这时精确的相互转换就无法执行,但是仍然有默认字符转换。 -- 6. VC语言,当定义了宏 _UNICODE 后,_T系列宏或函数,以`宽字符`承载UTF16编码。 TinyXml如何提供`宽字符`函数接口,支持解析UTF16编码、UTF32编码标准下的Xml字符串呢? 本项目: - 新增适用于`宽字符`参数的函数接口,调用字符集转换功能,转换为`窄字符`参数,再回调TinyXml原版接口。 - 对于以UTF16编码、或UTF32编码的Xml字符串,转换UTF8编 --

16,472

社区成员

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

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

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