WindowsCE下Unicode和Ansi字符间互相转换的例子

类别:VC语言 点击:0 评论:0 推荐:

纵所周知,WindowsCE下编程99%的问题都和Unicode有关.比如文件编辑,一般都保存为Ansi格式;无线通讯中控制Modem需要发送的AT指令,必须是Ansi格式;网络通讯中,PC端一般都是Ansi的,为了和PC上协议兼容,在WindowsCE中必须把要发送的一个指令从Unicode转换成Ansi格式...等等.很多初学者对于这些问题总是感到很麻烦.其实WindowsCE中有标准的API实现了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=WideCharToMultiByte(  //计算从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"
  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.
以上代码在MicroSoft Embed Visual C++ 3.0 + 联想天玑5100(WindowsCE3.0)
 + Eagle Tec 10M CF卡通过.
2003.Feb.18th,5:25PM,Roving in ShenZhen...

本文地址:http://com.8s8s.com/it/it1950.htm