字符串转换 char *->CComBSTR-> char *

Imisspassword 2005-11-16 11:40:16
因为发现程序出现问题,所以做了一个测试:

读取一个日文(还测试过希腊文)的文本文件,将内容转为BSTR,然后再转回,保存后的文件与原文件部分字节不同,出现乱码.
很简单的程序:
FILE * fp=fopen("f:\\text\\test.txt","rb");
if(fp)
{
fseek(fp, 0, SEEK_END);
int len = (int)ftell(fp);
fseek(fp, 0, SEEK_SET);
char * buf=new char[len];
fread(buf,len,1,fp);
CComBSTR strNew;
strNew=CComBSTR(buf);
USES_CONVERSION;
LPCSTR str = OLE2A(strNew);
FILE * fp1=fopen("f:\\text\\test1.txt","wb");
fwrite(str,1,_tcslen(str),fp1);
fclose(fp1);
delete [] buf;
fclose(fp);
}
操作系统是英文.
...全文
174 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
Zark 2005-11-18
  • 打赏
  • 举报
回复
当然是没有试过了,你让我伸手到你的硬盘里去拿f:\\text\\test.txt?
Imisspassword 2005-11-18
  • 打赏
  • 举报
回复
你的结论是想当然吧.
查了一下CComBSTR(buf);和OLE2A(strNew);这两处内部调用了MultiByteToWideChar和WideCharToMultiByte,而代码页只是简单的使用了CP_ACP,这才是导至乱码的原因.
Imisspassword 2005-11-17
  • 打赏
  • 举报
回复
楼上试过没有?我查看16进制编码,明显有多处不同.
Zark 2005-11-17
  • 打赏
  • 举报
回复
少了终结符而已.
FILE * fp=fopen("f:\\text\\test.txt","rb");
if(fp)
{
fseek(fp, 0, SEEK_END);
int len = (int)ftell(fp);
fseek(fp, 0, SEEK_SET);
char * buf=new char[len+1];
fread(buf,len,1,fp);

*buf[len]='\0';

CComBSTR strNew;
strNew=CComBSTR(buf);
USES_CONVERSION;
// LPCSTR str = OLE2A(strNew);
LPCSTR str = OLE2T(strNew);
FILE * fp1=fopen("f:\\text\\test1.txt","wb");
fwrite(str,1,_tcslen(str),fp1);
fclose(fp1);
delete [] buf;
fclose(fp);
}

3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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