WindowsCE下Unicode和Ansi字元間互相轉換的例子 (轉)

worldblog發表於2007-12-14
WindowsCE下Unicode和Ansi字元間互相轉換的例子 (轉)[@more@]

縱所周知,CE下99%的問題都和Unicode有關.比如編輯,一般都儲存為Ansi格式;通訊中控制Modem需要傳送的AT指令,必須是Ansi格式;通訊中,PC端一般都是Ansi的,為了和PC上相容,在WindowsCE中必須把要傳送的一個指令從Unicode轉換成Ansi格式...等等.很多初學者對於這些問題總是感到很麻煩.其實WindowsCE中有標準的實現了Unicode和Ansi字元間的互轉.下面就是網路通訊中的片斷.

m_psocket是指向一個從CCeSocket派生的類,如果沒有連線的話其為NULL;
m_snd是要傳送的CString,和一個EDIT相對應.

//傳送片斷
void CClient1Dlg::OnButtonSend()
{
 // TODO: Add your control notification handler code here
 if (!m_psocket)  //無Socket連線,退出
 {
 MessageBox(TEXT("無連線!"),TEXT("資訊"));
 return;
 }
 UpdateData(TRUE);  //儲存輸入的字串到m_snd
 unsigned char buf[129];  //傳送緩衝區
 ZeroMemory(buf,sizeof(buf));  //緩衝區清零
 CString tmpstr(m_snd);  //複製要傳送的字串
 int multibytelen=WCharToMultiByte(  //計算從Unicode轉換到Ansi後需要的位元組數
 CP_ACP,  //根據ANSI code page轉換
 WC_COMPOSITECHECK | WC_DEFAULTCHAR, //轉換出錯用預設字元代替
 tmpstr.GetBuffer(m_snd.GetLength()),  //要轉換的字串地址
 m_snd.GetLength(),  //要轉換的個數
 0,  //轉換後字串放置的地址
 0,  //最多轉換字元的個數,為0表示返回轉換Unicode後需要多少個位元組
 0,  //預設的字元:""
 0  //預設的設定
 );
 WideCharToMultiByte(  //轉換Unicode到Ansi
 CP_ACP,
 WC_COMPOSITECHECK | WC_DEFAULTCHAR,
 tmpstr.GetBuffer(m_snd.GetLength()),
 m_snd.GetLength(),
 (char *)buf,  //轉換到緩衝區中
 128,  //最多128個位元組
 0,
 0
 );
 int sendcount=m_psocket->Send(buf,multibytelen+1);  //傳送轉換後的緩衝區
 CString statusstr;
 statusstr.Format(TEXT("共傳送位元組數:%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個位元組
 int widecharlen=MultiByteToWideChar(  //計算從Ansi轉換到Unicode後需要的位元組數
 CP_ACP,
 MB_COMPOSITE,
 (char*)p,  //要轉換的Ansi字串
 -1,  //自動計算長度
 0,
 0
 );
 CString tmpstr;
 tmpstr.GetBuffer(widecharlen);  //為轉換後儲存Unicode字串分配
 MultiByteToWideChar(  //從Ansi轉換到Unicode字元
 CP_ACP,
 MB_COMPOSITE,
 (char*)p,
 -1,
 tmpstr.GetBuffer(widecharlen),  //轉換到tmpstr
 widecharlen  //最多轉換widecharlen個Unicode字元
 );

 m_clientdlg->m_listbox.InsertString(0,tmpstr);  //插入到listbox中顯示
 CCeSocket::OnReceive(nErrorCode);
}

注意:以上程式碼都是在WindowsCE樣板機上執行,PC端傳送和接收到的字元均為Ansi格式的.把以上程式碼稍微修改一下用到自己的產品中,就可以利用以前的協議無縫連線PDA和PC.
以上程式碼在 Embed Visual C++ 3.0 + 聯想天璣5100(WindowsCE3.0)
 + Eagle Tec 10M CF卡透過.
.Feb.18th,5:25PM,Roving in ShenZhen...


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-993270/,如需轉載,請註明出處,否則將追究法律責任。

相關文章