2009-02-03 16:21:01
WinCE和WinNT一樣,是UNICODE環(huán)境,盡管WinCE支持ASCII功能來(lái)進(jìn)行文件交換,但是WinCE的本地文件格式是Unicode。所以,我們要將字符串轉換為unicode才能使用。
在系統定義了_UNICODE 宏時(shí),_T和TEXT宏都可以將一個(gè)ansi字符轉換為一個(gè)寬字符的unicode字符。WideCharToMultiByte是將Unicode字符串轉換為ASCII字符串,MultiByteToWideChar則相反。當WinCE和pc通信時(shí),由于PC使用ASCII字符串在網(wǎng)絡(luò )上傳輸,所以當Wince接收到內容時(shí)要轉換為Unicode才能使用,而發(fā)送內容時(shí),要轉換為ASCII字符才能發(fā)送。那么如何判斷轉化后的字符大小呢?只要將這兩個(gè)函數中的轉換后的大小設為0,那么函數就會(huì )返回轉換后的實(shí)際大小,然后利用這個(gè)返回值再調用這兩個(gè)函數就可以實(shí)現轉換了。WinCE還提供了幾種專(zhuān)門(mén)用于Unicode字符的數據類(lèi)型,如WCHAR,LPWSTR,LPCWSTR,對于A(yíng)NSI字符函數如strcpy,strcmp等,WinCE提供了 wcscpy,wcscmp等于之對應。
縱所周知,WindowsCE下編程99%的問(wèn)題都和Unicode有關(guān).比如文件編輯,一般都保存為Ansi格式;無(wú)線(xiàn)通訊中控制Modem需要發(fā)送的 AT指令,必須是Ansi格式;網(wǎng)絡(luò )通訊中,PC端一般都是Ansi的,為了和PC上協(xié)議兼容,在WindowsCE中必須把要發(fā)送的一個(gè)指令從 Unicode 轉換成Ansi格式...等等.很多初學(xué)者對于這些問(wèn)題總是感到很麻煩.其實(shí)WindowsCE中有標準的API實(shí)現了Unicode和Ansi字符間的互轉.
在實(shí)際測試UDP接收過(guò)程中發(fā)現,可以通過(guò)兩種方式:
1。通過(guò)CString str=buf,CString內部即可完成轉換。
2。通過(guò)MultiByteToWideChar
DWORD dwNum = MultiByteToWideChar (CP_ACP, MB_COMPOSITE, (char*)buf, -1, NULL, 0);
wchar_t *pwText;
pwText = new wchar_t[dwNum];
if(!pwText)
{
delete []pwText;
}
MultiByteToWideChar(CP_ACP,MB_COMPOSITE,(char*)buf,-1,pwText,dwNum);
::MessageBox(NULL,pwText,_T("Recvd:"),MB_OK);
delete []pwText;
//////////////////////////////////////////////////////////////////////////////////////////例子/////////////////////////////////////////////////
//發(fā)送函數片斷
void CClient1Dlg::OnButtonSend()
{
// TODO: Add your control notification handler code here
if (!m_psocket) //無(wú)Socket連接,退出
{
MessageBox(TEXT("無(wú)連接!"),TEXT("信息"));
return;
}
UpdateData(TRUE); //保存輸入的字符串到m_snd
unsigned char buf[129]; //發(fā)送緩沖區
ZeroMemory(buf,sizeof(buf)); //緩沖區清零
CString tmpstr(m_snd); //復制要發(fā)送的字符串
int multibytelen=WideCharToMultiByte( //計算從Unicode轉換到Ansi后需要的字節數
CP_ACP, //根據ANSI code page轉換
WC_COMPOSITECHECK | WC_DEFAULTCHAR, //轉換出錯用缺省字符代替
tmpstr.GetBuffer(m_snd.GetLength()), //要轉換的字符串地址
m_snd.GetLength(), //要轉換的個(gè)數
0, //轉換后字符串放置的地址
0, //最多轉換字符的個(gè)數,為0表示返回轉換Unicode后需要多少個(gè)字節
0, //缺省的字符:"\0"
0 //缺省的設置
);
WideCharToMultiByte( //轉換Unicode到Ansi
CP_ACP,
WC_COMPOSITECHECK | WC_DEFAULTCHAR,
tmpstr.GetBuffer(m_snd.GetLength()),
m_snd.GetLength(),
(char *)buf, //轉換到緩沖區中
128, //最多128個(gè)字節
0,
0
);
int sendcount=m_psocket->Send(buf,multibytelen+1); //發(fā)送轉換后的緩沖區
CString statusstr;
statusstr.Format(TEXT("共發(fā)送字節數:%d"),sendcount);
m_status.SetWindowText(statusstr); //更新顯示欄
}
程序接收到的字符串最后保存到CString tmpstr中.
//接收函數片斷
void MyCeSocket::OnReceive(int nErrorCode)
{
// TODO: Add your specialized code here and/or call the base class
unsigned char p[129]; //接受緩沖區
ZeroMemory(p,sizeof(p)); //接收緩沖區清零
this->Receive(p,128); //接收128個(gè)字節
int widecharlen=MultiByteToWideChar( //計算從Ansi轉換到Unicode后需要的字節數
CP_ACP,
MB_COMPOSITE,
(char*)p, //要轉換的Ansi字符串
-1, //自動(dòng)計算長(cháng)度
0,
0
);
CString tmpstr;
tmpstr.GetBuffer(widecharlen); //為轉換后保存Unicode字符串分配內存
MultiByteToWideChar( //從Ansi轉換到Unicode字符
CP_ACP,
MB_COMPOSITE,
(char*)p,
-1,
tmpstr.GetBuffer(widecharlen), //轉換到tmpstr
widecharlen //最多轉換widecharlen個(gè)Unicode字符
);
m_clientdlg->m_listbox.InsertString(0,tmpstr); //插入到listbox中顯示
CCeSocket::OnReceive(nErrorCode);
}
(#)