WCHAR和char相互转换的问题

时间:2021-12-14 20:13:28
下面是定义的结构体:
typedef struct tagSERIALDATA
{
CHAR  serialData[10];
INT  serialDataLength;
}SERIALDATA,*PSERIALDATA;


if (28 == pCopyDataStruct->dwData)
{

if (pCopyDataStruct->cbData == 0 || NULL == pCopyDataStruct->lpData)
{
return FALSE;
}
nuMemset(&s_SerialData,0,sizeof(s_SerialData));
nuMemcpy(&s_SerialData,pCopyDataStruct->lpData,sizeof(s_SerialData));


NURO_UI_MESSAGE nrMsg = {0};
nrMsg.nMsgID = _MSG_HS_TO_NAVI_SERIALDATA_;
nrMsg.nParam1 = (DWORD)&s_SerialData;

if (0 != nrMsg.nMsgID)
{
m_LoadCallmgr.Message(nrMsg);
}
return TRUE;
}
return CDialog::OnCopyData(pWnd, pCopyDataStruct);
}

同事定义的结构体也是char类型的,但是后面的函数我要用到wchar类型,所以在下面的函数中做了如下的转化:
nuUINT CNLCViewVersionDlgJP::nSetVersionText()
{
//#ifdef VALUE_EMGRT
nuWcscpy(m_NR_VERSION.wKernelVer, s_pNchStringJP->wGetString(_STR_KERNEL_VERSION_));
//#else
//nuWcscpy(m_NR_VERSION.wKernelVer, (nuWCHAR *)_NR_KERNEL_VERSION_);
//#endif
#ifdef VALUE_EMGRT
nuWcscpy(m_NR_VERSION.wMapVer, s_pNchStringJP->wGetString(_STR_MAP_VERSION_));
#endif
nuWcscpy(m_NR_VERSION.wMapSource, s_pNchStringJP->wGetString(_STR_MAP_SOURCE_));
nuWcscpy(m_wVerNum,s_pNchStringJP->wGetString(_STR_VERSION_NUMBER_));

vSetObjectText(_ID_STATIC_KERNEL_VER_, m_NR_VERSION.wKernelVer);
vSetObjectText(_ID_STATIC_MAP_VER_, m_NR_VERSION.wMapVer);
vSetObjectText(_ID_STATIC_MAP_SOURCE_, m_NR_VERSION.wMapSource);
vSetObjectText(_ID_STATIC_VER_NUMBER_,m_wVerNum);

vSetObjectText(_ID_STATIC_OS_VER_, s_stcMainCtrlVer.wOS);
vSetObjectText(_ID_STATIC_SINGLECHIP_VER_, s_stcMainCtrlVer.wSingleChip);
vSetObjectText(_ID_STATIC_HARDWARE_VER_, s_stcMainCtrlVer.wHardWare);
vSetObjectText(_ID_STATIC_MAINCTRL_VER_,s_stcMainCtrlVer.wMainCtrl);
vSetObjectText(_ID_STATIC_MAINCTRL_UID_,CGnBaseDlg::s_wHSMacUID);

1:这是第一种方法:
int numChar = ::MultiByteToWideChar(0,0,s_stcSerialData.serialData,-1,NULL,0);
nuWCHAR *b = (nuWCHAR*)malloc(numChar*sizeof(nuWCHAR));
::MultiByteToWideChar(0,0,s_stcSerialData.serialData,-1,b,numChar);
vSetObjectText(_ID_STATIC_SERIALDATA_,b);
free(b);
2:这是第二种:
// vSetObjectText(_ID_STATIC_SERIALDATA_,(nuWCHAR*)s_stcSerialData.serialData);

3:这是第三种:
//  nuWCHAR SerialData[10];
//  nuAsctoWcs(SerialData,10,s_stcSerialData.serialData,10);
//  vSetObjectText(_ID_STATIC_SERIALDATA_,SerialData);


//  /*= TEXT("1234567")*/;
nuMemset(wsimdata,NULL,sizeof(wsimdata));
//nuAsctoWcs(wsimdata,20,s_stcSimNum.simdata,20);
//vSetObjectText(_ID_STATIC_SIM_NUMBER_,/*TEXT("1234567")*/wsimdata);

    return 1;
}

但是第一种和第三种,得到的确实乱码的结果,第二种报错误

下面贴同事的代码:

typedef struct tagSerialData
{
CHAR serialdata[10];
int serialDataLength;
}SERIALDATA, *PSERIALDATA;



void CHangShengMsgTestDlg::OnBnClickedButton6()
{
HWND hNavi = NULL;
hNavi = ::FindWindow(NULL,TEXT("guider"));
if (hNavi == NULL)
{
return ;
}
memset(&m_SerialData,0,sizeof(m_SerialData));
m_SerialData.serialDataLength = strlen("2591JKN600");
strcpy(m_SerialData.serialdata,"2591JKN600");


COPYDATASTRUCT SerialDataCopyData = {0};
SerialDataCopyData.dwData = 28;
SerialDataCopyData.cbData = sizeof(m_SerialData);
SerialDataCopyData.lpData = &m_SerialData;

::SendMessage(hNavi,WM_COPYDATA,0,(LPARAM)&SerialDataCopyData);
}

7 个解决方案

#1


MultiByteToWideChar 请正确设置第一个参数

#2


引用 1 楼 91program 的回复:
MultiByteToWideChar 请正确设置第一个参数


引用 1 楼 91program 的回复:
MultiByteToWideChar 请正确设置第一个参数



我接受过来的是数字和字母的组合,然后有两个MultiByteToWideChar ,是在不懂怎么设置第一个参数

#3


引用 2 楼 qq_27922603 的回复:
Quote: 引用 1 楼 91program 的回复:

MultiByteToWideChar 请正确设置第一个参数


引用 1 楼 91program 的回复:
MultiByteToWideChar 请正确设置第一个参数



我接受过来的是数字和字母的组合,然后有两个MultiByteToWideChar ,是在不懂怎么设置第一个参数


不懂没关系,可以查 MSDN。
或者,直接网上查找,有很多现成的代码可以参考 。

#4


引用 3 楼 91program 的回复:
Quote: 引用 2 楼 qq_27922603 的回复:

Quote: 引用 1 楼 91program 的回复:

MultiByteToWideChar 请正确设置第一个参数


引用 1 楼 91program 的回复:
MultiByteToWideChar 请正确设置第一个参数



我接受过来的是数字和字母的组合,然后有两个MultiByteToWideChar ,是在不懂怎么设置第一个参数


不懂没关系,可以查 MSDN。
或者,直接网上查找,有很多现成的代码可以参考 。



//  int len = strlen(s_stcSerialData.serialData);
//  int numChar = ::MultiByteToWideChar( CP_ACP,0,s_stcSerialData.serialData,-1,NULL,0);
// 
//  nuWCHAR *b = new nuWCHAR[numChar+1];
//  nuMemset(b,0,(numChar+1)*sizeof(nuWCHAR));
//  ::MultiByteToWideChar(CP_ACP,0,s_stcSerialData.serialData,-1,(LPWSTR)b,numChar);
//  wstring rt;
//  rt = (nuWCHAR *)b;
// 
//  vSetObjectText(_ID_STATIC_SERIALDATA_,rt);
//  delete b;


从网上看的,但是写到到文件里的还是乱码

#5


引用 4 楼 qq_27922603 的回复:
Quote: 引用 3 楼 91program 的回复:

Quote: 引用 2 楼 qq_27922603 的回复:

Quote: 引用 1 楼 91program 的回复:

MultiByteToWideChar 请正确设置第一个参数


引用 1 楼 91program 的回复:
MultiByteToWideChar 请正确设置第一个参数



我接受过来的是数字和字母的组合,然后有两个MultiByteToWideChar ,是在不懂怎么设置第一个参数


不懂没关系,可以查 MSDN。
或者,直接网上查找,有很多现成的代码可以参考 。



//  int len = strlen(s_stcSerialData.serialData);
//  int numChar = ::MultiByteToWideChar( CP_ACP,0,s_stcSerialData.serialData,-1,NULL,0);
// 
//  nuWCHAR *b = new nuWCHAR[numChar+1];
//  nuMemset(b,0,(numChar+1)*sizeof(nuWCHAR));
//  ::MultiByteToWideChar(CP_ACP,0,s_stcSerialData.serialData,-1,(LPWSTR)b,numChar);
//  wstring rt;
//  rt = (nuWCHAR *)b;
// 
//  vSetObjectText(_ID_STATIC_SERIALDATA_,rt);
//  delete b;


从网上看的,但是写到到文件里的还是乱码
WCHAR和char相互转换的问题

#6


你将 Unicode 字符串写入文件,有没有在文件的开始写入 Unicode 标志,好像是 0xfffe?

#7


引用 6 楼 91program 的回复:
你将 Unicode 字符串写入文件,有没有在文件的开始写入 Unicode 标志,好像是 0xfffe?




不是那个问题,我已经解决了,谢谢

#1


MultiByteToWideChar 请正确设置第一个参数

#2


引用 1 楼 91program 的回复:
MultiByteToWideChar 请正确设置第一个参数


引用 1 楼 91program 的回复:
MultiByteToWideChar 请正确设置第一个参数



我接受过来的是数字和字母的组合,然后有两个MultiByteToWideChar ,是在不懂怎么设置第一个参数

#3


引用 2 楼 qq_27922603 的回复:
Quote: 引用 1 楼 91program 的回复:

MultiByteToWideChar 请正确设置第一个参数


引用 1 楼 91program 的回复:
MultiByteToWideChar 请正确设置第一个参数



我接受过来的是数字和字母的组合,然后有两个MultiByteToWideChar ,是在不懂怎么设置第一个参数


不懂没关系,可以查 MSDN。
或者,直接网上查找,有很多现成的代码可以参考 。

#4


引用 3 楼 91program 的回复:
Quote: 引用 2 楼 qq_27922603 的回复:

Quote: 引用 1 楼 91program 的回复:

MultiByteToWideChar 请正确设置第一个参数


引用 1 楼 91program 的回复:
MultiByteToWideChar 请正确设置第一个参数



我接受过来的是数字和字母的组合,然后有两个MultiByteToWideChar ,是在不懂怎么设置第一个参数


不懂没关系,可以查 MSDN。
或者,直接网上查找,有很多现成的代码可以参考 。



//  int len = strlen(s_stcSerialData.serialData);
//  int numChar = ::MultiByteToWideChar( CP_ACP,0,s_stcSerialData.serialData,-1,NULL,0);
// 
//  nuWCHAR *b = new nuWCHAR[numChar+1];
//  nuMemset(b,0,(numChar+1)*sizeof(nuWCHAR));
//  ::MultiByteToWideChar(CP_ACP,0,s_stcSerialData.serialData,-1,(LPWSTR)b,numChar);
//  wstring rt;
//  rt = (nuWCHAR *)b;
// 
//  vSetObjectText(_ID_STATIC_SERIALDATA_,rt);
//  delete b;


从网上看的,但是写到到文件里的还是乱码

#5


引用 4 楼 qq_27922603 的回复:
Quote: 引用 3 楼 91program 的回复:

Quote: 引用 2 楼 qq_27922603 的回复:

Quote: 引用 1 楼 91program 的回复:

MultiByteToWideChar 请正确设置第一个参数


引用 1 楼 91program 的回复:
MultiByteToWideChar 请正确设置第一个参数



我接受过来的是数字和字母的组合,然后有两个MultiByteToWideChar ,是在不懂怎么设置第一个参数


不懂没关系,可以查 MSDN。
或者,直接网上查找,有很多现成的代码可以参考 。



//  int len = strlen(s_stcSerialData.serialData);
//  int numChar = ::MultiByteToWideChar( CP_ACP,0,s_stcSerialData.serialData,-1,NULL,0);
// 
//  nuWCHAR *b = new nuWCHAR[numChar+1];
//  nuMemset(b,0,(numChar+1)*sizeof(nuWCHAR));
//  ::MultiByteToWideChar(CP_ACP,0,s_stcSerialData.serialData,-1,(LPWSTR)b,numChar);
//  wstring rt;
//  rt = (nuWCHAR *)b;
// 
//  vSetObjectText(_ID_STATIC_SERIALDATA_,rt);
//  delete b;


从网上看的,但是写到到文件里的还是乱码
WCHAR和char相互转换的问题

#6


你将 Unicode 字符串写入文件,有没有在文件的开始写入 Unicode 标志,好像是 0xfffe?

#7


引用 6 楼 91program 的回复:
你将 Unicode 字符串写入文件,有没有在文件的开始写入 Unicode 标志,好像是 0xfffe?




不是那个问题,我已经解决了,谢谢