关于WinCE的unicode问题
来源:互联网 发布:软件工程硕士几年 编辑:程序博客网 时间:2024/05/17 01:42
关于WinCE的unicode问题
2008-06-11 02:17
WinCE和WinNT一样,是UNICODE环境,尽管WinCE支持ASCII功能来进行文件交换,但是WinCE的本地文件格式是
Unicode。所以,我们要将字符串转换为unicode才能使用。
在这篇文章中,作者提到了了TEXT宏,和WideCharToMultiByte及MultiByteToWideChar两个函数。在系统定义了
_UNICODE 宏时,_T和TEXT宏都可以将一个ansi字符转换为一个宽字符的unicode字符。WideCharToMultiByte是将Unicode字符串转换为ASCII字符串,MultiByteToWideChar则相反。当WinCE和pc通信时,由于PC使用ASCII字符串在网络上传输,所以当Wince接收到内容时要转换为Unicode才能使用,而发送内容时,要转换为ASCII字符才能发送。那么如何判断转化后的字符大小呢?只要将这两个函数中的转换后的大小设为0,那么函数就会返回转换后的实际大小,然后利用这个返回值再调用这两个函数就可以实现转换了。WinCE还提供了几种专门用于Unicode字符的数据类型,如WCHAR,LPWSTR,LPCWSTR,对于ANSI字符函数如strcpy,strcmp等,WinCE提供了 wcscpy,wcscmp等于之对应。
嵌入开发(WinCE)的一些经验[摘录]
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后需要的字节数
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中显示
Unicode。所以,我们要将字符串转换为unicode才能使用。
在这篇文章中,作者提到了了TEXT宏,和WideCharToMultiByte及MultiByteToWideChar两个函数。在系统定义了
_UNICODE 宏时,_T和TEXT宏都可以将一个ansi字符转换为一个宽字符的unicode字符。WideCharToMultiByte是将Unicode字符串转换为ASCII字符串,MultiByteToWideChar则相反。当WinCE和pc通信时,由于PC使用ASCII字符串在网络上传输,所以当Wince接收到内容时要转换为Unicode才能使用,而发送内容时,要转换为ASCII字符才能发送。那么如何判断转化后的字符大小呢?只要将这两个函数中的转换后的大小设为0,那么函数就会返回转换后的实际大小,然后利用这个返回值再调用这两个函数就可以实现转换了。WinCE还提供了几种专门用于Unicode字符的数据类型,如WCHAR,LPWSTR,LPCWSTR,对于ANSI字符函数如strcpy,strcmp等,WinCE提供了 wcscpy,wcscmp等于之对应。
嵌入开发(WinCE)的一些经验[摘录]
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后需要的字节数
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中显示
转载地址 :http://hi.baidu.com/mikenoodle/blog/item/d5e95eee9cadf6feb3fb9521.html
- 关于WinCE的unicode问题
- 关于WinCE的unicode问题
- 关于unicode 的问题!
- 关于Unicode的问题(转)
- 关于UNICODE/ANSI的问题
- 关于pdf-----unicode的问题
- 关于WinCE CAB Manager的一些问题
- 关于wince的几个小问题
- 关于WinCE中config.bib的问题
- 关于WinCE中config.bib的问题
- 关于Wince的重启问题
- 关于unicode编程的一个问题
- 关于unicode,宽字符的问题
- Wince unicode
- WinCE中Unicode文本文档的编写
- 关于WINCE下输入法的问题的解决方法
- 关于wince下串口问题
- 关于WinCE下通讯乱码及unicode转换
- oracle 多表连合修改----BYPASS_UJVC
- error C1189
- Windows 7任务计划帮你自动运行程序
- AS3播放RED5视频
- 用好ASP.NET 2.0的URL映射
- 关于WinCE的unicode问题
- Ubuntu 下bochs 的安装与使用
- 数据库查询汇总
- dynamic_cast与static_cast
- VS2010下载地址集
- 使用sp_addextendedproperty添加描述信息
- 替换所有"xxxx"为_T("xxxx")
- 关于CLR Binder
- Apache MINA 快速入门