真正懂Unicode工程、ANSI文件、Unicode文件,关系的进

zhangwuji154 2010-12-30 05:30:34
我的工程是Unicode的,用CStdioFile读ANSI文件,中文是乱码,这个问题可以用
http://zongtongyi.blogbus.com/logs/8372306.html
这个链接的内容解决,但是,仍然不能解决Unicode工程读Unicode文件,读不正确的问题。
连乱码都不是,我看内存是,老是0在前,所以CString直接判断字符串就为空了。
不要直接贴一个MultiByteToWideChar之类的函数,这个是解决Unicode与ANSI之间转换的,但
Unicode工程读Unicode文件,是Unicode把Unicode文件当ANSI文件读了,其中已经用了一次MultiByteToWideChar函数
...全文
206 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
IranCyberArmy 2010-12-30
  • 打赏
  • 举报
回复
if (bIsUnicode)
{
// char chr[100];
// ZeroMemory(chr, 100);
TCHAR tchr[50];
ZeroMemory(tchr, 50*sizeof(TCHAR));
m_f.Read(tchr, 50);

AfxMessageBox(tchr);
return;
}else{
// CString strText;
// m_f.ReadString(strText);
//strText.Format(_T("%s"), (LPTSTR)achr);
char chr[100];
ZeroMemory(chr, 100);
m_f.Read((LPTSTR)chr, 99);
TCHAR tchr[50];
MultiByteToWideChar( CP_ACP, 0, chr,
-1, tchr,
sizeof(tchr)/sizeof(tchr[0]) );
/*sizeof(tchr)/sizeof(tchr[0]) 这个算出来是50,也就是TCHAR tchr[50];这儿申明的大小*/
AfxMessageBox(tchr);
return;
}
IranCyberArmy 2010-12-30
  • 打赏
  • 举报
回复
这么麻烦,干脆用CFile得了
char chr[100];
ZeroMemory(chr, 100);
m_f.Read((LPTSTR)chr, 99);
TCHAR tchr[50];
MultiByteToWideChar( CP_ACP, 0, chr,
-1, tchr,
sizeof(tchr)/sizeof(tchr[0]) );
AfxMessageBox(tchr);
baby393 2010-12-30
  • 打赏
  • 举报
回复
你也可以参考一下这里
http://blog.csdn.net/jun_01/archive/2005/07/28/437612.aspx
baby393 2010-12-30
  • 打赏
  • 举报
回复
其实楼主只要认真看一下源代码就能解决很多问题。
CStdioFile内部使用CRT代码来读写文件,因此如果出现你所说的问题,例如它内部自动转换等操作,你可以显式的使用_set_fmode(_O_WTEXT/_O_TEXT/_O_BINARY);等告诉它我只需要按UNICODE/ANSI/二进制方式工作,不需要你自作主张。
leechiyang 2010-12-30
  • 打赏
  • 举报
回复
运行时的环境只能是UNICODE或ansi编码的一种,推荐用UINCODE,文件里面是什么编码就很难说了,可能是UNICODE,GB2312,也可能是UTF8(很多html文件喜欢用UTF8),UNICODE还分LE BE两种编码方式,文件开头还可能有签名。所以,直接读到内存里面以某种编码显示肯定不行,兼容性很差。最好的办法是用IMultiLanguage2进行检测,IE自动检测编码的功能,就是这么做的,分析出编码的格式来,进行编码转换后再显示。iconv可能也有类似功能。
JIGSONG 2010-12-30
  • 打赏
  • 举报
回复
你若再UNICODE环境下申请一个CString变量,该变量已经是UNICODE类型的,不用做任何的变化直接按照UNICODE来处理。

但是有些函数不认上述的UNICODE变量,类似MessageBox之类,还需要对UNICODE变量做一些判断和处理(主要是文件前缀删减),
可以参考一下:http://blog.csdn.net/JIGSONG/archive/2010/12/09/6066523.aspx

最好在UNICODE环境中直接申请char型变量,然后使用常用的函数做转换,这样系统会做好内部处理。

[Quote=引用楼主 zhangwuji154 的回复:]
我的工程是Unicode的,用CStdioFile读ANSI文件,中文是乱码,这个问题可以用
http://zongtongyi.blogbus.com/logs/8372306.html
这个链接的内容解决,但是,仍然不能解决Unicode工程读Unicode文件,读不正确的问题。
连乱码都不是,我看内存是,老是0在前,所以CString直接判断字符串就为空了。
不要直接贴一个Multi……
[/Quote]
leechiyang 2010-12-30
  • 打赏
  • 举报
回复
用IMultiLanguage2检测编码
wangbo56916860 2010-12-30
  • 打赏
  • 举报
回复
UNICODE工程是指编译器按照unicode格式的形式编译文件

而UNICODE工程下的文件当中的字符不一定是unicode编码
zhangwuji154 2010-12-30
  • 打赏
  • 举报
回复
就Unicode,没用大端那个
mayudong1 2010-12-30
  • 打赏
  • 举报
回复
试了下,记事本文件,内容abc,保存成unicode,每个字符两个字节,0在后(但其实是内存的高位),保存成Unicode big endian,0在前(内存的地位)
  • 打赏
  • 举报
回复
Unicode和ANSI字符串原理一样,碰到连续的两个字节为0,就认为字符串结束了,而ANSI只一个
既然文件前面有不少的0,就不能用字符串的方式去访问
hw_henry2008 2010-12-30
  • 打赏
  • 举报
回复
显示的define一下UNICODE一下试试?
zhangwuji154 2010-12-30
  • 打赏
  • 举报
回复
那都扯到机器码了
mayudong1 2010-12-30
  • 打赏
  • 举报
回复
哈哈,好像不应该叫small吧
mayudong1 2010-12-30
  • 打赏
  • 举报
回复
unicode还分big endian和small endian呢

16,472

社区成员

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

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

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