请教大家一个问题:
我在wince下的edit控件中输入汉字、数字、字母,并保存在临时文件中。当我再次打开对话框,把临时文件中的东东全部放回edit控件时,数字和字母能正确显示,但是汉字只显示问号“?”!请问这是什么原因?
下面是代码
当edit空间中有变化就保存在临时文件中:
CFile tempfile;
CHAR* information=new CHAR[200];
CString str;
CEdit *pEditIP=(CEdit*)GetDlgItem(IDC_EDIT_SECTION);
pEditIP->GetWindowTextW(str);
tempfile.Open(FILESECTION,CFile::modeWrite);
tempfile.Seek(148,CFile::begin);
WideCharToMultiByte(CP_ACP,WC_COMPOSITECHECK,str.GetBuffer(str.GetLength())
,str.GetLength(),information,str.GetLength()*2,NULL,NULL);
tempfile.Write(information,200);
ZeroMemory(information,200);
delete []information;
tempfile.Close();
下面是当再次打开对话框,初始化对话框时对edit初始化的代码:
CFile tempfile;
CString str;
CHAR* tmp1=new CHAR[200];
tempfile.Open(FILESECTION,CFile::modeRead);
tempfile.Seek(148,CFile::begin);
tempfile.Read(tmp1,200);
str=tmp1;
CEdit *pEditIP;
pEditIP=(CEdit*)GetDlgItem(IDC_EDIT_NAME1);
pEditIP->SetWindowTextW(str);
tempfile.close();
在线等待!马上给分!
那是因为你没有添加中文支持。
如果不想添加也没关系,输入法输入到editbox中的是GB码,在保存到文件之前转换成UNICODE就可以了。
WideCharToMultiByte(CP_ACP,WC_COMPOSITECHECK,str.GetBuffer(str.GetLength())
,str.GetLength(),information,str.GetLength()*2,NULL,NULL);
这句就是转换成UNICODE的吧
WinCE下默认是使用UNICODE的,你使用的文件类使用的是ASCII码,所以在读写的过程中,就出现了这个问题。
引用: 引用 6 楼 yashi 的回复:
WinCE下默认是使用UNICODE的,你使用的文件类使用的是ASCII码,所以在读写的过程中,就出现了这个问题。
输入法直接敲出来的字未必是UNICODE码。
void CSDFILEDlg::OnWrite()
{
// TODO: Add your control notification handler code here
DWORD len,actlen;
char *pcharbuff;
if (hFile == INVALID_HANDLE_VALUE)
{
MessageBox(_T("文件未打开!"));
return;
}
UpdateData(TRUE);
len = m_strDisp.GetLength(); /* 取得输入字符串的长度 */
pcharbuff = new char[len];
LPTSTR pStr = m_strDisp.GetBuffer(len); /* 取得输入字符串的缓冲区指针 */
// 将 Unicode 的 CString 转换为 char 型
WideCharToMultiByte(CP_ACP, 0, pStr, len, pcharbuff, len, NULL, NULL);
m_strDisp.ReleaseBuffer();
BOOL ret = SetFilePointer(hFile, 0, NULL, FILE_BEGIN); /* 移动文件指针到文件开头 */
if (ret == 0xFFFFFFFF)
{
MessageBox(_T("将文件指针移至文件开头失败!"));
delete[] pcharbuff;
return;
}
ret = WriteFile(hFile, pcharbuff, len, &actlen, NULL); /* 将数据写入文件中 */
if (ret == TRUE)
MessageBox(_T("写文件成功!"));
else
MessageBox(_T("写文件失败!"));
if (pcharbuff != NULL)
delete[] pcharbuff;
}
void CSDFILEDlg::OnRead()
{
// TODO: Add your control notification handler code here
DWORD filelen,actlen;
char *pcharbuff;
if (hFile == INVALID_HANDLE_VALUE)
{
MessageBox(_T("文件未打开!"));
return;
}
filelen = GetFileSize(hFile, NULL); /* 获取文件大小 */
if (filelen == 0xFFFFFFFF)
{
MessageBox(_T("获取文件大小失败!"));
return;
}
BOOL ret = SetFilePointer(hFile, 0, NULL, FILE_BEGIN); /* 移动文件指针到文件开头 */
if (ret == 0xFFFFFFFF)
{
MessageBox(_T("将文件指针移至文件开头失败!"));
return;
}
pcharbuff = new char[filelen];
ret = ReadFile(hFile, pcharbuff, filelen, &actlen, NULL); /* 从文件中读出数据 */
if (ret == TRUE)
{
LPTSTR pStr = m_strDisp.GetBuffer(filelen);
// 将字节转化为 Unicode 字符串
MultiByteToWideChar(CP_ACP, 0, pcharbuff, filelen, pStr, filelen);
m_strDisp.ReleaseBuffer();
UpdateData(FALSE); /* 将读出的数据显示出来 */
MessageBox(_T("读文件成功!"));
}
else
{
UpdateData(FALSE);
MessageBox(_T("读文件失败!"));
}
if (pcharbuff != NULL)
delete[] pcharbuff;
}
"我在wince下的edit控件中输入汉字、数字、字母,
并保存在临时文件中。当我再次打开对话框,把临时
文件中的东东全部放回edit控件时"
我刚刚做了和楼主一样的事情
利用上面的函数可以显示
汉字,数字,字母均可
我昨天已经做了测试
代码中,有两个编辑框关联的CString类型变量
我可以将代码工程全部发给楼主做参考
也可以给你截图看看我的测试
QQ:253786989
——————————————————————————
JOYZML(朱铭雷) 感谢娜娜
还是不行啊
我用朱铭雷兄的方法试过了
在虚拟机上可以
但是在arm板上运行就不行
是不是因为我的板子上操作系统添加中文库支持有问题呢?
你这样测试下
在PC机上
创建一个test.txt文本
然后写上几个汉字
通过ActiveSync或者SD卡等下载到板子上
之后程序不写, 而是直接读
试一下
怀疑你在windows ce下
输入的字符直接就是UNICODE字符
而程序再次做了转化
——————————————————————————
JOYZML(朱铭雷)