几何尺寸与公差论坛------致力于产品几何量公差标准GD&T (GDT:ASME)|New GPS(ISO)研究/CAD设计/CAM加工/CMM测量  


返回   几何尺寸与公差论坛------致力于产品几何量公差标准GD&T (GDT:ASME)|New GPS(ISO)研究/CAD设计/CAM加工/CMM测量 » 仿射空间:CAX软件开发(三)二次开发与程序设计 » CAD二次开发 » AutoCAD二次开发 » ObjectARX(VB.NET/C#)
用户名
密码
注册 帮助 会员 日历 银行 搜索 今日新帖 标记论坛为已读


 
 
主题工具 搜索本主题 显示模式
旧 2009-04-29, 04:52 PM   #1
yang686526
高级会员
 
注册日期: 06-11
帖子: 14579
精华: 1
现金: 224494 标准币
资产: 234494 标准币
yang686526 向着好的方向发展
默认 【转帖】multibytetowidechar和widechartomultibyte用法详解 - 精华帖集合

multibytetowidechar和widechartomultibyte用法详解 - 精华帖集合
www.dimcax.com
multibytetowidechar和widechartomultibyte用法详解
“multibytetowidechar和widechartomultibyte用法详解”
2006-12-27 14:50

//========================================================================
//title:
// multibytetowidechar和widechartomultibyte用法详解
//author:
// norains
//date:
// thursday 25-december -2006
//environment:
// evc4.0 + standard sdk
//========================================================================
在本文开始之处,先简要地说一下何为短字符和宽字符.
所谓的短字符,就是用8bit来表示的字符,典型的应用是ascii码.而宽字符,顾名思义,就是用16bit表示的字符,典型的有unicode.关于windows下的ascii和unicode的更多信息,可以参考这两本经典著作:《windows 程序设计》,《windows 核心编程》.这两本书关于这两种字符都有比较详细的解说.

宽字符转换为多个短字符是一个难点,不过我们只要掌握到其中的要领,便可如鱼得水.
好吧,那就让我们开始吧.

这个是我们需要转化的宽字符串:
wchar_t wtext[20] = {l"宽字符转换实例!ok!"};

我们需要知道转化后的短字符需要多少个数组空间.虽然在这个里程里面,我们可以直接定义一个20*2短字符的数组,并且事实上将运行得非常轻松愉快.但假如宽字符串更多,达到上千个乃至上万个,我们将会发现其中浪费的内存将会越来越多.所以以宽字符的个数的两倍作为短字符数组下标的声明绝对不是一个好主意.
所幸,我们能够确知所需要的数组空间.
我们只需要将multibytetowidechar()的第四个形参设为-1,即可返回所需的短字符数组空间的个数:
dword dwnum = multibytetowidechar (cp_acp, 0, wtext, -1, null, 0);

接下来,我们只需要分配响应的数组空间:
char *pstext;
pstext = new char[dwnum];
if(!pstext)
{
delete []pstext;
}

接着,我们就可以着手进行转换了.在这里以转换成ascii码做为例子:
multibytetowidechar (cp_acp, 0, pstext, -1, wtext, dwsize);

最后,使用完毕当然要记得释放占用的内存:
delete []pstext;

同理,多个短字符转为宽字符的代码如下:
char stext[20] = {l"宽字符转换实例!ok!"};
dword dwnum = widechartomultibyte (cp_acp, 0, stext, -1, null, 0);
wchar_t *pwtext;
pwtext = new wchar_t[dwnum];
if(!pstext)
{
delete []pstext;
}
widechartomultibyte (cp_acp, 0, pwtext, -1, stext, dwsize);
delete []pwtext;

如果之前我们已经分配好空间,并且由于字符串较短,可以不理会浪费的空间,仅仅只是想简单地将短字符和宽字符相互转换,那有没有什么简便的方法呢?
win32 api里没有符合这种要求的函数,但我们可以自己进行封装:

//-------------------------------------------------------------------------------------
//description:
// this function maps a character string to a wide-character (unicode) string
//
//parameters:
// lpcszstr: [in] pointer to the character string to be converted
// lpwszstr: [out] pointer to a buffer that receives the translated string.
// dwsize: [in] size of the buffer
//
//return values:
// true: succeed
// false: failed
//
//example:
// mbytetowchar(sza,szw,sizeof(szw)/sizeof(szw[0]));
//---------------------------------------------------------------------------------------
bool mbytetowchar(lpcstr lpcszstr, lpwstr lpwszstr, dword dwsize)
{
// get the required size of the buffer that receives the unicode
// string.
dword dwminsize;
dwminsize = multibytetowidechar (cp_acp, 0, lpcszstr, -1, null, 0);

if(dwsize < dwminsize)
{
return false;
}


// convert headers from ascii to unicode.
multibytetowidechar (cp_acp, 0, lpcszstr, -1, lpwszstr, dwminsize);
return true;
}

//-------------------------------------------------------------------------------------
//description:
// this function maps a wide-character string to a new character string
//
//parameters:
// lpcwszstr: [in] pointer to the character string to be converted
// lpszstr: [out] pointer to a buffer that receives the translated string.
// dwsize: [in] size of the buffer
//
//return values:
// true: succeed
// false: failed
//
//example:
// mbytetowchar(szw,sza,sizeof(sza)/sizeof(sza[0]));
//---------------------------------------------------------------------------------------
bool wchartombyte(lpcwstr lpcwszstr, lpstr lpszstr, dword dwsize)
{
dword dwminsize;
dwminsize = widechartomultibyte(cp_oemcp,null,lpcwszstr,-1,null,0,null,false);
if(dwsize < dwminsize)
{
return false;
}
widechartomultibyte(cp_oemcp,null,lpcwszstr,-1,lpszstr,dwsize,null,false);
return true;
}


使用方法也很简单,示例如下:
wchar_t wtext[10] = {l"函数示例"};
char stext[20]= {0};
wchartombyte(wtext,stext,sizeof(stext)/sizeof(stext[0]));
mbytetowchar(stext,wtext,sizeof(wtext)/sizeof(wtext[0]));

这两个函数的缺点在于无法动态分配内存,在转换很长的字符串时可能会浪费较多内存空间;优点是,在不考虑浪费空间的情况下转换较短字符串非常方便.
[ ]
yang686526离线中   回复时引用此帖
GDT自动化论坛(仅游客可见)
 


主题工具 搜索本主题
搜索本主题:

高级搜索
显示模式

发帖规则
不可以发表新主题
不可以回复主题
不可以上传附件
不可以编辑您的帖子

vB 代码开启
[IMG]代码开启
HTML代码关闭



所有的时间均为北京时间。 现在的时间是 02:13 AM.


于2004年创办,几何尺寸与公差论坛"致力于产品几何量公差标准GD&T | GPS研究/CAD设计/CAM加工/CMM测量"。免责声明:论坛严禁发布色情反动言论及有关违反国家法律法规内容!情节严重者提供其IP,并配合相关部门进行严厉查处,若內容有涉及侵权,请立即联系我们QQ:44671734。注:此论坛须管理员验证方可发帖。
沪ICP备06057009号-2
更多