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下保存中文到文本文件中去
分全给有代码参考的...虽然不多....
{
// 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的字节数。
WritePrivateProfileString
WritePrivateProfileStruct
WritePrivateProfileSection
GetPrivateProfileInt
GetPrivateProfileStruct
等等
int a1=str1.GetLength(); //得到CString 字符串的长度
有汉字的话就不一定是对的了,他返回的是字符的个数不是字节数
可以试试用WideCharToMultiByte把UNICODE字符转换成多字节,再写入的文件。或者直接用4楼所说的ini专用的api函数来读写ini文件。
定义了Unicode, IDC_EDIT里一定是unicode, CString里也一定是unicode,
CFILE::Write中需要指明的是写入字节数, 而CString::GetBuffer()返回的是字符数,
一个unicode字符2字节, 所以CString::GetBuffer() * 2, 还是乱码的话检查其他代码.
刚才我试了下另保存为UNICODE字符的TXT,用CreateFileW打开后再写入是乱码,这个时候它已经是ANSI字符了,但在16进制编辑器里看UNICODE字符已经写进去了。
{
// 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标记了.....
file1.Write(_T("\r\n"),4);
哦,我直接copy你的代码,以后你记得unicode文件开头必须是0xFF 0xFE就行了.