CStdioFile.ReadString读取中文产生乱码解决方法
2016-04-11 23:45
253 查看
首先需要明确:1、CStdioFile对Unicode的支持不好,最好采用CFile进行读取操作;2、在Unicode环境下ReadString按char读取,并填入Unicode的CString变量中。对于包含中文的ANSI文本,采用File.ReadString读取,如果不进行转换一定会产生乱码。
经过在CSND的一番折腾,找到解决办法如下:
void CTestDlg::ReadStringCharToUnicode(CString &str)
{
char *szBuf = new char[str.GetLength() + 1];//注意“+1”,char字符要求结束符,而CString没有
memset(szBuf, '\0',str.GetLength());
int i;
for ( i = 0 ; i < str.GetLength(); i++)
{
szBuf[i] = (char)str.GetAt(i);
}
szBuf[i] = '\0';//结束符。否则会在末尾产生乱码。
int nLen;
WCHAR *ptch;
CString strOut;
if(szBuf == NULL)
{
return ;
}
nLen = MultiByteToWideChar(CP_ACP, 0, szBuf, -1, NULL, 0);//获得需要的宽字符字节数
ptch = new WCHAR[nLen];
memset(ptch, '\0', nLen);
MultiByteToWideChar(CP_ACP, 0, szBuf, -1, ptch, nLen);
str.Format(_T("%s"), ptch);
if(NULL != ptch)
delete [] ptch;
ptch = NULL;
if(NULL != szBuf)
delete []szBuf;
szBuf = NULL;
return ;
}
更多0
经过在CSND的一番折腾,找到解决办法如下:
void CTestDlg::ReadStringCharToUnicode(CString &str)
{
char *szBuf = new char[str.GetLength() + 1];//注意“+1”,char字符要求结束符,而CString没有
memset(szBuf, '\0',str.GetLength());
int i;
for ( i = 0 ; i < str.GetLength(); i++)
{
szBuf[i] = (char)str.GetAt(i);
}
szBuf[i] = '\0';//结束符。否则会在末尾产生乱码。
int nLen;
WCHAR *ptch;
CString strOut;
if(szBuf == NULL)
{
return ;
}
nLen = MultiByteToWideChar(CP_ACP, 0, szBuf, -1, NULL, 0);//获得需要的宽字符字节数
ptch = new WCHAR[nLen];
memset(ptch, '\0', nLen);
MultiByteToWideChar(CP_ACP, 0, szBuf, -1, ptch, nLen);
str.Format(_T("%s"), ptch);
if(NULL != ptch)
delete [] ptch;
ptch = NULL;
if(NULL != szBuf)
delete []szBuf;
szBuf = NULL;
return ;
}
更多0
相关文章推荐
- 坑爹的CCARRAY_FOREACH
- Android学习中一些零散的知识点
- 创建调试信息文件失败
- android的单例设计模式
- iOS8设置NavigationBar颜色和BackButtonItem颜色
- uva 120 stacks of flapjacks ——yhx
- C#实现清理系统内存
- Html批量读取json
- 赛码网--水仙花数
- Struts2 的基本配置
- c++实验三-计算税收及收入
- 异常情况下的Activity生命周期
- C 【冒泡 选择排序 & 折半查找】
- ZOJ 3929 Deque and Balls
- Nginx探索五
- 我为什么要学习Linux?
- UE4中StaticLoadClass和StaticLoadObject
- c++第3次作业
- 中项笔记(七)
- js的defineProperty方法