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

原创 2003年02月19日 09:12:00

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

VC中Ansi、Unicode、UTF8字符串之间的转换和写入文本

VC中Ansi、Unicode、UTF8字符串之间的转换和写入文本 Ansi字符串我们最熟悉,英文占一个字节,汉字2个字节,以一个\0结尾,常用于txt文本文件 Unicode字符串,每个字符(汉...
  • ruiqingzheng
  • ruiqingzheng
  • 2013年05月28日 20:39
  • 2141

php 字符编码转换类,支持ANSI、Unicode、Unicode big endian、UTF-8、UTF-8+Bom 互相转换

php 字符编码转换类,支持ANSI、Unicode、Unicode big endian、UTF-8、UTF-8+Bom 互相转换。...
  • fdipzone
  • fdipzone
  • 2015年01月30日 20:40
  • 26447

按行读取ANSI、UNICODE 、UNICODE big endian、UTF-8四种文本文

代码简介 1.问题提出 MFC提供的文件类CStdioFile,其中一个函数ReadString实现了文件的按行读取,但是不能满足不同类型的文本文件的按行读取,为了解决这一问题,笔者初步研究了一些...
  • sky101010ws
  • sky101010ws
  • 2016年06月20日 16:35
  • 1653

字符编码转换类,支持 ANSI、Unicode、Unicode big endian、UTF-8、UTF-8+Bom互相转换

  • 2015年01月30日 20:37
  • 2KB
  • 下载

Unicode转换Ansi字符

  • 2010年01月01日 13:16
  • 171KB
  • 下载

UTF8-UNICODE-ANSI编码互相转换小软件

  • 2011年11月19日 00:30
  • 240KB
  • 下载

[参考资料] PB中字符编码转换[ansi, UTF8, Unicode]

[参考资料] PB中字符编码转换[ansi, UTF8, Unicode]
  • smilysoft
  • smilysoft
  • 2017年03月22日 12:25
  • 885

UNICODE字符串和ANSI字符的转换

windows把字符串分成两类,UNICODE字符串和基于code page的ANSI字符串。UNICDOE字符串使用UTF-16LE编码方式(占2字节,其值与UNICODE编码真值一致,暂不考虑位于...
  • tsdcsp2002
  • tsdcsp2002
  • 2011年11月13日 23:03
  • 1973

Windows下字符编码转换(ANSI <--> Unicode <--> UTF-8)

摘自https://github.com/JoyLeeSoft/StringConverter,感谢JoyLeeSoft的分享。 主要实现windows平台下ANSI、Unicode、UTF-8编...
  • huojianying123456
  • huojianying123456
  • 2015年04月02日 22:34
  • 2209

封装ANSI,UNICODE,UTF8互相转换类

Ansi22Utf8.h #pragma once #include #include using namespace std; class Ansi22Utf8 { public: An...
  • educast
  • educast
  • 2014年01月25日 09:05
  • 1563
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:WindowsCE下Unicode和Ansi字符间互相转换的例子
举报原因:
原因补充:

(最多只允许输入30个字)