void CautoWoWDlg::OnBnClickedSave1()
{
// TODO: 在此添加控件通知处理程序代码
CString str1;
GetDlgItem(IDC_EDIT1)->GetWindowText(str1); //////显示名字
int a1=str1.GetLength();                //得到CString 字符串的长度
CFile file1;
if(!file1.Open(_T("name.ini"),  CFile::modeWrite))          
{
 MessageBox(_T("无法修改配置文件name.ini"));
 return;
}
LPTSTR p = str1.GetBuffer();  //... 这个指针 p 发生了很多事情
for( int i = 0 ; i< a1 ; i++)
{   
if(p[i]==44)
{
file1.Write(_T("\r\n"),2);
}
else
{
CString strTemp;
strTemp=p[i];
file1.Write(strTemp,strTemp.GetLength());
}
}
}以上代码在非unicode模式下可以正常保存中文到文件中去
但如果工程改为unicode就出现乱码请教各位大大如何在unicode下保存中文到文本文件中去
分全给有代码参考的...虽然不多....

解决方案 »

  1.   

    void CautoWoWDlg::OnBnClickedSave1()
    {
        // TODO: 在此添加控件通知处理程序代码
        CString str1;
        GetDlgItem(IDC_EDIT1)->GetWindowText(str1);        //////显示名字
        int a1=str1.GetLength();                //得到CString 字符串的长度
        CFile file1;
                if(!file1.Open(_T("name.ini"),  CFile::modeWrite))          
                    {
                         MessageBox(_T("无法修改配置文件name.ini"));
                         return;
                    }
                LPTSTR p = str1.GetBuffer();  //... 这个指针 p 发生了很多事情
                for( int i = 0 ; i< a1 ; i++)
                        {   
                            if(p[i]==44)
                                {
                                    file1.Write(_T("\r\n"),4);                            }
                            else
                            {
                            CString strTemp;
                            strTemp=p[i];
                            file1.Write(strTemp,strTemp.GetLength()*2);
                            }
                        }
    }
    楼主大概是忘记了每个UNICODE字符是占2个字节的事实了吧。红色部分改了下你Write的字节数。
      

  2.   

    把str1.Getbuffer()用WideCharToMultiByte转成type数组
      

  3.   

    ini文件的管理有直接的API
    WritePrivateProfileString
    WritePrivateProfileStruct
    WritePrivateProfileSection
    GetPrivateProfileInt
    GetPrivateProfileStruct
    等等
      

  4.   

    Unicode下
    int a1=str1.GetLength();                //得到CString 字符串的长度
    有汉字的话就不一定是对的了,他返回的是字符的个数不是字节数
      

  5.   

    保证你的ini文件是unicode的,可以先用文件方法写个bom头。
      

  6.   


    可以试试用WideCharToMultiByte把UNICODE字符转换成多字节,再写入的文件。或者直接用4楼所说的ini专用的api函数来读写ini文件。
      

  7.   

    ini不是关键.....只是想知道为什么会乱码.....还有怎么样解决乱码....
      

  8.   


    定义了Unicode, IDC_EDIT里一定是unicode, CString里也一定是unicode, 
    CFILE::Write中需要指明的是写入字节数, 而CString::GetBuffer()返回的是字符数, 
    一个unicode字符2字节, 所以CString::GetBuffer() * 2, 还是乱码的话检查其他代码.
      

  9.   

    在UNICODE字符下GetLength返回的就是字符个数。
    刚才我试了下另保存为UNICODE字符的TXT,用CreateFileW打开后再写入是乱码,这个时候它已经是ANSI字符了,但在16进制编辑器里看UNICODE字符已经写进去了。
      

  10.   

    void CautoWoWDlg::OnBnClickedSave1()
    {
    // TODO: 在此添加控件通知处理程序代码
    CString str1;
    GetDlgItem(IDC_EDIT1)->GetWindowText(str1);        //////显示名字
    int a1=str1.GetLength();                //得到CString 字符串的长度
    CFile file1;
    if(!file1.Open(_T("name.ini"),  CFile::modeWrite))          
    {
    MessageBox(_T("无法修改配置文件name.ini"));
    return;
    }
    LPTSTR p = str1.GetBuffer();  //... 这个指针 p 发生了很多事情
    WCHAR unicodeFlag = 0xFEFF;
    f.Write(&unicodeFlag, sizeof(unicodeFlag));
    for( int i = 0 ; i< a1 ; i++)
    {   
    if(p[i]==44)
    {
    file1.Write(_T("\r\n"),2);
    }
    else
    {
    CString strTemp;
    strTemp=p[i];
    file1.Write(strTemp,strTemp.GetLength() * 2);
    }
    }
    }这样试试,我忘了unicode标记了.....
      

  11.   

    感谢楼上的....可以了...没有乱码了...只是这里应该是4
    file1.Write(_T("\r\n"),4);
      

  12.   


    哦,我直接copy你的代码,以后你记得unicode文件开头必须是0xFF 0xFE就行了.