首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

嵌入开发(WinCE)的一些经验 001

嵌入开发(WinCE)的一些经验 001

WindowsCE下Unicode和Ansi字符间互相转换的例子
纵所周知,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后需要的字节数
返回列表