(他山之石)MFC学习之路(四)MultiByteToWideChar和WideCharToMultiByte用法详解

MFC 各字符类型转换收集 【代码】MFC 各字符类型转换收集。 阅读详情

转自墨雨博客:http://blog.youkuaiyun.com/norains/article/details/1461174

//========================================================================
//TITLE:
//    MultiByteToWideChar和WideCharToMultiByte用法详解
//AUTHOR:
//    norains
//DATE:
//    第一版:Monday  25-December -2006
//    增补版:Wednesday 27-December -2006
//    修订版:Wednesday 14-March-2007 (修正之前的错误例子)
//    再次修订版:Tuesday 18-September-2007 (修正代码的参数错误)

//    再再次修订版:Friday 02-April-2009 (修正文章举例的错误)
//Environment:
//  EVC4.0 + Standard SDK
//========================================================================
 
1.使用方法详解

  在本文开始之处,先简要地说一下何为短字符和宽字符.
  所谓的短字符,就是用8bit来表示的字符,典型的应用是ASCII码.而宽字符,顾名思义,就是用16bit表示的字符,典型的有UNICODE.关于windows下的ASCII和UNICODE的更多信息,可以参考这两本经典著作:《windows 程序设计》,《windows 核心编程》.这两本书关于这两种字符都有比较详细的解说.
 
  宽字符转换为多个短字符是一个难点,不过我们只要掌握到其中的要领,便可如鱼得水.
  好吧,那就让我们开始吧.
 
  这个是我们需要转化的多字节字符串: 
  char sText[20] = {"多字节字符串!OK!"};
 
  我们需要知道转化后的宽字符需要多少个数组空间.虽然在这个里程里面,我们可以直接定义一个20个宽字符的数组(如果全部是中文,则宽字符数组需要10个;反之,如果是英文字符,则需要20个。这里选取的是最大值),并且事实上将运行得非常轻松愉快.但假如多字节字符串更多,达到上千个乃至上万个,我们将会发现其中浪费的内存将会越来越多.所以以多字节字符的个数的两倍作为宽字符数组下标的声明绝对不是一个好主意.
  所幸,我们能够确知所需要的数组空间.
  我们只需要将MultiByteToWideChar()的第四个形参设为-1,即可返回所需的宽字符数组空间的个数:
  DWORD dwNum = MultiByteToWideChar (CP_ACP, 0, sText, -1, NULL, 0);
 
  接下来,我们只需要分配响应的数组空间:
  wchar_t *pwText;
  pwText = new wchar_t[dwNum];
  if(!pwText)
  {
   delete []pwText;
  }
 
  接着,我们就可以着手进行转换了.在这里以转换成ASCII码做为例子:
  MultiByteToWideChar (CP_ACP, 0, sText, -1, pwText, dwNum);
 
  最后,使用完毕当然要记得释放占用的内存:
  delete []pwText;
 

  同理,宽字符转为多字节字符的代码如下: 
  wchar_t wText[20] = {L"宽字符转换实例!OK!"};
  DWORD dwNum = WideCharToMultiByte(CP_OEMCP,NULL,wText,-1,NULL,0,NULL,FALSE);
  char *psText;
  psText = new char[dwNum];
  if(!psText)
  {
   delete []psText;
  }
  WideCharToMultiByte (CP_OEMCP,NULL,wText,-1,psText,dwNum,NULL,FALSE);
  delete []psText;
 
   如果之前我们已经分配好空间,并且由于字符串较短,可以不理会浪费的空间,仅仅只是想简单地将短字符和宽字符相互转换,那有没有什么简便的方法呢?
   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]));
 
  这两个函数的缺点在于无法动态分配内存,在转换很长的字符串时可能会浪费较多内存空间;优点是,在不考虑浪费空间的情况下转换较短字符串非常方便.

 
2.MultiByteToWideChar()函数乱码的问题

  有的朋友可能已经发现,在标准的WinCE4.2或WinCE5.0 SDK模拟器下,这个函数都无法正常工作,其转换之后的字符全是乱码.及时更改MultiByteToWideChar()参数也依然如此.
  不过这个不是代码问题,其结症在于所定制的操作系统.如果我们定制的操作系统默认语言不是中文,也会出现这种情况.由于标准的SDK默认语言为英文,所以肯定会出现这个问题.而这个问题的解决,不能在简单地更改控制面板的"区域选项"的"默认语言",而是要在系统定制的时候,选择默认语言为"中文".
  系统定制时选择默认语言的位置于:
  Platform -> Setting... -> locale -> default language ,选择"中文",然后编译即可.

MFC中 CString转char *的最好用的方法之WideCharToMultiByte MFC中 CString转char *的最好用的方法之WideCharToMultiByte 这样用虽然麻烦了点,但是基本UNICODE或者MBCS的工程都可用 CString ChannelNumber = "\<e name=\"ChannelNo\" ro=\"true\"\>"; DWORD dwNum = WideCharToMultiByte(CP_OEMCP, NULL, ChannelNumber, -1, NULL, NULL, 0, NULL); char* numb 阅读详情

相关推荐

C++使用WideCharToMultiByte函数生成UTF-8编码文件的方法

WideCharToMultiByte函数映射一个unicode字符串到一个多字节字符串。 函数原型: int WideCharToMultiByte UINT CodePage, //指定执行转换的代码页 DWORD dwFlags, //允许你进行额外的控制,它会影响使用了读音符号(比如重音)的字符 LPCWSTR lpWideCharStr, //指定要转换为宽字节字符串的缓冲区 int cchWideChar, //指定由参数lpWideCharStr指向的缓冲区的字符个数 LPSTR lpMultiByteStr, //指向接收被转换字符串的缓冲区 int

MultiByteToWideChar的用法

MultiByteToWideChar的用法 MultiByteToWideChar:   1)调用MultiByteToWideChar,为lpWideCharStr参数传入待转换的字符串,为cchWideChar参数传入0,为cchMultiByte参数传入-1;   2)分配一块足够容纳转换后Unicode字符串的内存,它的大小是上一个MultiByteToWideChar调用的返回值

曾经(一卡通/支付/卡系统/POS/读卡器 c/c++/java/c#/android/sql) 现在 c++/golang后台/window客户端高级开发 9507

IDEA 2023.2最新破解安装教程(含详细配置步骤及常见问题解决)

本文详细介绍了IDEA 2023.2的安装流程及高效开发环境搭建指南,涵盖基础配置、项目结构优化、核心功能使用、插件推荐、性能优化等全方位内容,帮助开发者快速掌握这一强大的Java开发工具。

x2y3z4a5b的博客 1754

MultiByteToWideChar和WideCharToMultiByte用法详解

Windows 2000是使用Unicode从头进行开发的,如果调用任何一个Windows函数并给它传递一个ANSI字符串,那么系统首先要将字符串转换成Unicode,然后将Unicode字符串传递给操作系统。例如函数通常希望在字符中传递一个缓存的大小,而不是字节。而这个问题的解决,不能在简单地更改控制面板的"区域选项"的"默认语言",而是要在系统定制的时候,选择默认语言为"中文"。MB_PRECOMPOSED:通常使用预作字符——就是说,由一个基本字符和一个非空字符组成的字符只有一个单一的字符值。

m0_37346206的博客 4041

WorkBuddy驱动SolidWorks实测:AI建模流程、参数化与许可排查指南

AI辅助三维建模正在改变工程师的重复劳动方式。其核心理念不是替代人的设计决策,而是通过AI智能体接管CAD软件中的草图绘制、特征创建、尺寸修改等高频操作,让工程师从繁琐的GUI交互中解放出来。在SolidWorks这类主流CAD平台上,这类AI助手的落地依赖环境稳定、需求描述清晰和参数化建模规范。通过将外径、孔距等关键尺寸定义为全局变量并用方程式驱动,可实现改一个数、模型自动更新的高效流程;同时,遇到“无法获得许可”等环境故障时,需要按服务状态、安全软件隔离、干净卸载的顺序排查。以WorkBuddy驱动So

weixin_28559803的博客 371

电磁兼容(EMC):一文读懂过电应力(EOS)

过电应力(EOS)是指元器件承受的电流或电压应力超过其允许的最大范围。产品的电磁兼容(EMC)失效的一种常见模型为过电应力(EOS),也是电子产品失效的最常见的情况之一。过电应力基本与半导体器件相关,EOS事件包括有:静电放电(ESD)、雷击、系统瞬态、电磁脉冲、充电等。本文将详细讨论一下产品设计中如何关注EOS设计。

linkking27的博客 6485

MFC-----MultiByteToWideChar和WideCharToMultiByte用法详解

//========================================================================//TITLE://    MultiByteToWideChar和WideCharToMultiByte用法详解//AUTHOR://    norains//DATE://    第一版:Monday  25-December -2006//   

miyunhong的专栏 2764

第03章 Hermes Agent 核心原理

环境跑通之后,读者会很自然地想问:Hermes 的内部到底是怎么转起来的?为什么它能做到"越用越聪明"?长对话不会忘记上下文吗?这一章用尽量短的篇幅把核心原理讲清楚。理解原理不是为了纸上谈兵,而是为了在第7章实战时能判断"为什么 Hermes 这么响应"以及"我应该把哪类任务交给它"。

亢少军的博客 142

MFC--WideCharToMultiByte和MultiByteToWideChar函数的用法

   为了支持Unicode编码,需要多字节与宽字节之间的相互转换。这两个系统函数在使用时需要指定代码页,在实际应用过程中遇到乱码问题,然后重新阅读《Windows核心编程》,总结出正确的用法。 WideCharToMultiByte的代码页用来标记与新转换的字符串相关的代码页。 MultiByteToWideChar的代码页用来标记与一个多字节字符串相关的代码页。 常用的代

Diniy 1409

COSMO-RS理论:流体相热力学预测的核心模型与技术突破

摘要:COSMO-RS模型通过量子化学计算分子表面电荷分布,实现了从微观量子尺度到宏观化工过程的热力学预测。该模型基于介电连续介质理论,将分子表面片段化处理,通过σ-剖面描述电荷分布,并计算片段间的静电失配能和氢键能。其核心算法通过自洽化学势方程求解活度系数,克服了传统模型依赖实验参数的局限。随着技术进步,模型引入了高阶描述符和色散力修正,提升了预测精度。在药物研发、化工分离等领域广泛应用,但仍存在对长程有序结构预测不足等局限性。该模型为复杂体系的热力学性质预测提供了重要理论工具。

ASKCOS博客 974

Spring-AI 第 17 章 - 飞书机器人接入详解

✅ Stream 长连接(官方 SDK)✅ AI 对话(支持工具调用)✅ 消息接收与回复✅ 天气查询✅ 数据库查询✅ 数学计算✅ 事件去重Stream 长连接模式:使用官方 SDK 建立 WebSocket 长连接,服务器主动连接飞书,无需公网 IP消息处理流程:接收消息 → 解析内容 → AI 处理 → 回复用户AI 工具调用:接入 FunctionTools,支持天气、计算、日期、数据库查询等多种工具。

AppBlog.CN全栈架构 211

MFC中MultiByteToWideChar和WideCharToMultiByte

MultiByteToWideChar 作用: 可以映射一个字符串到一个宽字节(Unicode) 的字符串 .由该函数映射的字符串没必要是多字节字符组。 函数原型: int WINAPI MultiByteToWideChar( _In_ UINT CodePage, _In_ DWORD dwFlags, _In_NLS_string_(cbMultiByte) LPCCH lpMultiByteStr, _In_ int cbMultiByte, _Out_wri

QQ845264718 726

STM32H743的FDCAN使用方法(1):STM32CubeMX初始化代码生成

STM32H743的FDCAN使用方法(1):STM32CubeMX初始化代码生成。

kevin1499的博客 2566

临时记录--MultiByteToWideChar,WideCharToMultiByte

LPCTSTR在UNICODE下是第字占双字符,也就是其内部使用的是wchar_t, 多字符是每个占二个字符的,而char是占一个字符的,你这么直接转就丢失了一半内容了。 可以用MultiByteToWideChar和WideCharToMultiByte实现多字节与宽字节之间的转换。这个是我们需要转化的多字节字符串: char sText[20] = {"多字节字符串!OK!"}; 我们需要知道

massice的专栏 1505

QEMU源码全解析 —— virtio(3)

QEMU源码全解析 —— virtio(3)

phmatthaus的专栏 1849

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Unicode UTF-8 Ansi 互转及MultiByteToWideChar和WideCharToMultiByte用法等编码相关

Unicode UTF-8 Ansi 互转及MultiByteToWideChar和WideCharToMultiByte用法等编码相关 分类: MFC/SDK/C++2010-05-18 20:53 2818人阅读 评论(1) 收藏 举报 目录(?)[+] Unicode,到UTF-8。   [cpp] view plainc

pirate97的专栏 7860

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

[转]VC: MultiByteToWideChar和WideCharToMultiByte用法

 //========================================================================//TITLE://    MultiByteToWideChar和WideCharToMultiByte用法详解//AUTHOR://    norains//DATE://    第一版:Monday  25-December -2006//

笑风生 3347

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

WideCharToMultiByte与MultiByteToWideChar

搞编程的程序员怎么可能不遇到关于编码的问题呢?在网页经常用到 :gb2312,UTF-8等等,在数据库上也会用到,还有还有很多多......无奈,今天又遇到了一个编码的问题,就是在MFC中的WideCharToMultiByte与MultiByteToWideChar这两个编码转换函数,看了一上午的东西,终于在看了 荷包蛋:http://www.cnblogs.com/gakusei/artic

liu563582815的专栏 928

WideCharToMultiByte和MultiByteToWideChar函数的用法 (MFC中常用)

为了支持Unicode编码,需要多字节与宽字节之间的相互转换。这两个系统函数在使用时需要指定代码页,在实际应用过程中遇到乱码问题,然后重新阅读《Windows核心编程》,总结出正确的用法。 WideCharToMultiByte的代码页用来标记与新转换的字符串相关的代码页。 MultiByteToWideChar的代码页用来标记与一个多字节字符串相关的代码页。 常用的代码页由CP_ACP和C

tianyu030963的专栏 726

MultiByteToWideChar的与WideCharToMultiByte的参数详解

以下内容转自:http://hi.baidu.com/%BF%AA%D0%C4_%D0%D6%B5%DC/blog/item/17768a038d0390703812bb19.html  第一个就是宽字符到多字节字符转换函数,函数原型如下: int WideCharToMultiByte( UINT CodePage, DWORD dwFlags, LP

DSB2510的专栏 1589

详细分析WideCharToMultiByte()和MultiByteToWideChar()的源码

书籍:《Visual C++ 2017从入门到精通》的2.7 字符串环境:visual studio 2022内容:几个->(将单字节char*转换为宽字节wchar_t *)(将宽字节wchar_t* 转换为单字节char *)

felicity_one的博客 642

MultiByteToWideChar 与 WideCharToMultiByte

MultiByteToWideChar 与 WideCharToMultiByte

abc 287

MultiByteToWideChar函数和树控件的使用

TVIS_STATEIMAGEMASK:用于指定项的状态图像索引的位的掩码。ERROR_INSUFFICIENT_BUFFER:提供的缓冲区大小不够大,或者错误地设置为 NULL。ERROR_NO_UNICODE_TRANSLATION:在字符串中找到无效的 Unicode。TVIS_OVERLAYMASK:用于指定项的覆盖图像索引的位的掩码。TVIS_EXPANDEDONCE:项的子项列表至少已展开一次。ERROR_INVALID_FLAGS:为标志提供的值无效。TVIS_SELECTED:该项已选定。

qq_45059758的博客 505

MultiByteToWideChar和WideCharToMultiByte用法详解(转)

MultiByteToWideChar:      函数功能:该函数映射一个字符串到一个宽字符(unicode)的字符串。由该函数映射的字符串没必要是多字节字符组。   函数原型:int MultiByteToWideChar(UINT CodePage, DWORD dwFlags, LPCSTR lpMultiByteStr, int cchMultiByte, LPW

ccfxue的博客 501

MFC CStringA 和CStringW 互转

#include "stdafx.h" #include "CStringToolEx.h" #include <cstringt.h> // // CStringA转CStringW // CStringW CStrA2CStrW(const CStringA &cstrSrcA) { int len = MultiByteToWideChar(CP_ACP, 0, LPCSTR(cstrSrcA), -1, NULL, 0); wchar_t *wstr = ne.

我的 博客 710
上一篇: (他山之石)MFC学习之路(三)关于编译【windows核心编程】01-ShowError 源代码出错 ,解决方法!
下一篇: MFC学习之路(八) 关于多态
QSCJOB
博客等级 码龄15年 17粉丝 33原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值