最近做一个小工具需要向注册表写入一个路径,发现写入注册会乱码,读取如果带中文也读到乱码。经过半天时间的研究,发现原来是unicode编码的问题。
原先用这种方式把CString转成LPBYTE类型
LPBYTE lpData = new BYTE[str.GetLength()+1];
int i = 0;
for(; i < str.GetLength(); i++) {
*(lpData+i) = str.GetAt(i);
}
RegSetValueEx(hProductKey,"FilePath",0,REG_SZ,lpData ,len);
,因为unicode编码下直接转成LPBYTE结果只剩第一个字符。也就是说把unicode编码转成ANSI编码就能正确转换了,所以代码改为如下:
int wlen=wcslen(str)*2;
char *pElementText = new char[wlen];
WideCharToMultiByte(CP_ACP,NULL,str,-1,pElementText,wlen+2,NULL,NULL);
RegSetValueExA(hProductKey,"FilePath",0,REG_SZ,(unsigned char*)pElementText,wlen);
成功正却写入带中文的路径键值。
但是读取到含中文的键值还是乱码,所以读取后做了如下操作:
CString str = _T("");
LPBYTE lpData = new BYTE[256];
DWORD cbData = 256;
DWORD dwType = REG_SZ;
if(RegQueryValueExA(hProductKey,"FilePath", 0, &dwType, lpData, &cbData) == ERROR_SUCCESS){
int ichrLen=strlen((char*)lpData);
int iLen=MultiByteToWideChar(CP_ACP,0,(char*)lpData,ichrLen,NULL,0);
TCHAR* buf=new TCHAR[iLen+1];
MultiByteToWideChar(CP_ACP,0,(char*)lpData,ichrLen,buf,iLen);
buf[iLen]=' ';
str.Format(_T("%s"),buf);
delete []buf;
}
,把宽字节变回unicode编码。