• 软件测试技术
  • 软件测试博客
  • 软件测试视频
  • 开源软件测试技术
  • 软件测试论坛
  • 软件测试沙龙
  • 软件测试资料下载
  • 软件测试杂志
  • 软件测试人才招聘
    暂时没有公告

字号: | 推荐给好友 上一篇 | 下一篇

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

发布: 2007-7-01 20:40 | 作者: admin | 来源: | 查看: 64次 | 进入软件测试论坛讨论

领测软件测试网

纵所周知,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...


延伸阅读

文章来源于领测软件测试网 https://www.ltesting.net/


关于领测软件测试网 | 领测软件测试网合作伙伴 | 广告服务 | 投稿指南 | 联系我们 | 网站地图 | 友情链接
版权所有(C) 2003-2010 TestAge(领测软件测试网)|领测国际科技(北京)有限公司|软件测试工程师培训网 All Rights Reserved
北京市海淀区中关村南大街9号北京理工科技大厦1402室 京ICP备2023014753号-2
技术支持和业务联系:info@testage.com.cn 电话:010-51297073

软件测试 | 领测国际ISTQBISTQB官网TMMiTMMi认证国际软件测试工程师认证领测软件测试网