我的工程是Unicode的,用CStdioFile读ANSI文件,中文是乱码,这个问题可以用
http://zongtongyi.blogbus.com/logs/8372306.html
这个链接的内容解决,但是,仍然不能解决Unicode工程读Unicode文件,读不正确的问题。
连乱码都不是,我看内存是,老是0在前,所以CString直接判断字符串就为空了。
不要直接贴一个MultiByteToWideChar之类的函数,这个是解决Unicode与ANSI之间转换的,但
Unicode工程读Unicode文件,是Unicode把Unicode文件当ANSI文件读了,其中已经用了一次MultiByteToWideChar函数

解决方案 »

  1.   

    unicode还分big endian和small endian呢
      

  2.   

    显示的define一下UNICODE一下试试?
      

  3.   

    Unicode和ANSI字符串原理一样,碰到连续的两个字节为0,就认为字符串结束了,而ANSI只一个
    既然文件前面有不少的0,就不能用字符串的方式去访问
      

  4.   

    试了下,记事本文件,内容abc,保存成unicode,每个字符两个字节,0在后(但其实是内存的高位),保存成Unicode big endian,0在前(内存的地位)
      

  5.   

    UNICODE工程是指编译器按照unicode格式的形式编译文件而UNICODE工程下的文件当中的字符不一定是unicode编码
      

  6.   

    你若再UNICODE环境下申请一个CString变量,该变量已经是UNICODE类型的,不用做任何的变化直接按照UNICODE来处理。但是有些函数不认上述的UNICODE变量,类似MessageBox之类,还需要对UNICODE变量做一些判断和处理(主要是文件前缀删减),
    可以参考一下:http://blog.csdn.net/JIGSONG/archive/2010/12/09/6066523.aspx最好在UNICODE环境中直接申请char型变量,然后使用常用的函数做转换,这样系统会做好内部处理。
      

  7.   

    运行时的环境只能是UNICODE或ansi编码的一种,推荐用UINCODE,文件里面是什么编码就很难说了,可能是UNICODE,GB2312,也可能是UTF8(很多html文件喜欢用UTF8),UNICODE还分LE BE两种编码方式,文件开头还可能有签名。所以,直接读到内存里面以某种编码显示肯定不行,兼容性很差。最好的办法是用IMultiLanguage2进行检测,IE自动检测编码的功能,就是这么做的,分析出编码的格式来,进行编码转换后再显示。iconv可能也有类似功能。
      

  8.   

    其实楼主只要认真看一下源代码就能解决很多问题。
    CStdioFile内部使用CRT代码来读写文件,因此如果出现你所说的问题,例如它内部自动转换等操作,你可以显式的使用_set_fmode(_O_WTEXT/_O_TEXT/_O_BINARY);等告诉它我只需要按UNICODE/ANSI/二进制方式工作,不需要你自作主张。
      

  9.   

    你也可以参考一下这里
    http://blog.csdn.net/jun_01/archive/2005/07/28/437612.aspx
      

  10.   

    这么麻烦,干脆用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);
      

  11.   

    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;
    }