Windows中两种多字符与宽字符的转换方法

通过Windows API来了解多字节与宽字符 多字节 ASCII是用来表示英文字符的一种编码规范。每个ASCII字符占用1个字节,因此,ASCII编码可以表示的最大字符数是 255(00H—FFH)。其实,英文字符并没有那么多,一般只用前128个(00H—7FH,最高位为0),其中包括了控制字符、数字、大小写字母和其它一些符号。而最高位为1的另128个字符(80H—FFH)被称为“扩展ASCII”,一般用来存放英文的制表符、部分音标字符 阅读详情

在Windows中经常需要用到多字符与宽字符的转换方法,所以多字符(MultiChar)也就是ANSI编码的方式,而宽字符(WideChar)也就是Unicode编码的方式。


首先是两种传统的转换方法,分别是MutiByteToWideChar和WideCharToMutiByte。


int MultiByteToWideChar(

  UINT CodePage,

  DWORD dwFlags,

  LPCSTR lpMultiByteStr,

  int cchMultiByte,

  LPWSTR lpWideCharStr,

  int cchWideChar

  );


这是多字符转换为宽字符的方法,6个参数的含义为:CodePage(多字符所对应的的字符集,一般是CP_ACP), dwFlags(一些标准位,一般不需要使用,置0即可),lpMultiByteStr(多字符的地址),cchMultiBytes(多字符的字符串长度,相当于字符串的字节数,如果是1,则由函数判断长度), lpWideCharStr(宽字符的地址),cchWideChar(宽字符的字符长度,相当于字符串的个数)。上面的两个长度都是包含‘\n’的长度。

如果lpWideCharStr不为NULL,返回转换成功的长度;如果lpWideCharStr为NULL,返回lpMultiByteStr的字符个数(不是字符串长度!!!)。


常用的用法为:

//先将lpWideCharStr置成NULL,从而得到szText的长度。
int iBuffSize = ::MultiByteToWideChar(CP_ACP, 0, szText, -1, NULL, 0);
//判断字符长度是否大于0
if (iBuffSize > 0)
{
    LPWSTR wszString = new wchar_t[iBuffSize+1];
    int nChars = ::MultiByteToWideChar(CP_ACP, 0, szText, -1,     wszString, iBuffSize);
    //这是担心转换失败,从而nChars为0,再讲wszString置成空字符串
    nChars = nChars < iBuffSize ? nChars:iBuffSize;
    wszString[nChars] = 0;
}


另一个是宽字符到多字符:

int WideCharToMultiByte(

  UINT CodePage,
  DWORD dwFlags,
  LPCWSTR lpWideCharStr,
  int cchWideChar,
  LPSTR lpMultiByteStr,
  int cchMultiByte,
  LPCSTR lpDefaultChar,
  LPBOOL pfUsedDefaultChar
  );


这里比MultiByteToWideChar多两个参数,而前面的六个参数都是一样的,lpDefaultChar的作用是当函数遇到一个不能转换的宽字符时,会用lpDefaultChar来代替,如果lpDefaultChar为NULL时,则用?代替。pfUsedDefaultChar的作用是如果有一个字符没有成功转换,则pfUsedDefaultChar为TRUE,否则为FALSE。

int iBuffSize = ::WideCharToMultiByte(CodePage, 0, szString, -1, NULL, 0, NULL, false);
if (iBuffSize > 0 )
{
    m_pString = new char[iBuffSize];
    ::WideCharToMultiByte(CodePage, 0, szString, -1, m_pString, iBuffSize, NULL, false);
}

另两种转换的方法是A2W和W2A,分别表示多字符到宽字符,宽字符到多字符。这两个函数式atl的函数,所以需要加上头文件<atlconv.h>

USES_CONVERSION;
wchar_t wszText[]=L"1.Unicode字符转换为ANSI;";
char szText[]="2.ANSI字符转换成Unicode.";
printf("%s\n",W2A(wszText));
wprintf(L"%s\n",A2W(szText));

注意的是每做一个转换前,一定要加上USES_CONVERSION。


不过要注意是不要在大循环或者非常长的函数中使用W2A或者A2W,因为有内存溢出的问题。




宽字符(Wide Characters)全面解析 宽字符是编程中处理多语言文本的重要数据类型,支持Unicode标准,能够表示全球多种语言的字符。摘要指出:1)宽字符(如wchar_t)比窄字符占用更多内存但支持更全字符集;2)C/C++通过wchar.h等库提供宽字符支持,C++11新增char16_t/char32_t类型;3)标准库提供wcscpy/wcslen等宽字符处理函数;4)需注意不同平台下宽字符大小差异(Windows为16位,Linux为32位);5)实际开发中应合理处理内存和编码转换问题。掌握宽字符对开发国际化软件至关重要。 阅读详情

相关推荐

sid图像数据_遥感影像数据

影像数据基本概念影像数据是由卫星或飞机上的成像系统获得的影像,多为遥感影像数据。影像数据的每个像元都有一个值,表示传感器探测到像素对应地面面积上目标物的电磁辐射强度,也叫亮度值、灰度值。SuperMap支持的影像数据格式有:*.img、*.tif、*.tiff、*.bmp、*.jpg、*.png、*.gif、*.raw、*.sid等。计算机以二进制记录数据,所以其量化的等级以二进制来划分,即2n。...

weixin_39534395的博客 1626

Windows下多字节字符转宽字符

这个代码页都是指多字节字符串的代码页,MultiByteToWideChar的源字符串和WideCharToMultiByte的目标字符串的代码页。MultiByteToWideChar调用两遍,第一次调用,buff用的NULL,目的是计算转换后字符个数,便于申请内存。1. 调用A结尾的API, 使用多字节字符集函数处理后,转为Unicode字符串。2.调用W结尾的API,使用宽字符集函数处理后,就是Unicode字符串。说了一个奇怪的情况, API用的宽字符版本,代码却是使用多字节字符集。

caz28的专栏 593

Vivado实战:如何用BUFGMUX_CTRL实现FPGA双时钟热切换(附时序约束模板)

本文详细介绍了如何使用Xilinx FPGA中的BUFGMUX_CTRL原语实现双时钟热切换的工业级解决方案。通过分析BUFGMUX_CTRL的核心机制、PCB布局约束和电源噪声抑制方法,提供Vivado实现全流程和时序约束模板,帮助工程师在工业自动化、车载电子等场景中提升系统可靠性。

weixin_29186249的博客 575

[警告] multi-字符 character constant [-Wmultichar] ----字符+符号输出错误

在用dev c++做题的时候遇到一个问题,就是我想直接输出-1的时候,我想到了python中的字符串输出。 print('-1') #-1 在python中这样是合法的语法。 在C++中我就想用cout同样输出。 int main(){ cout<<'-1'<<endl;}//11569 打印出来的并不是-1,而且是11569. 这是因为cout对单引号引用的多个字符是处理不了的,用双引号引用即可。C++中的字符与字符串是不一样的。字符是用单引号引用,而字符串是双引号。 同样如果

qq_30747875的博客 4399

从零搭建 SAP ALE/IDoc:自定义 IDoc 结构、Outbound 发送、Inbound 入库与排错全流程

本文介绍了SAP系统中ALE和IDoc技术的应用,用于解决分布式系统集成中的数据传递问题。主要内容包括: ALE/IDoc技术概述 ALE通过消息驱动方式实现业务数据传递 IDoc作为标准化数据信封,包含控制信息、业务数据和状态记录 支持SAP与非SAP系统间集成 核心概念 ALE的价值在于业务消息传递而非远程调用 IDoc由控制记录、数据记录和状态记录三部分组成 WE60工具用于查看IDoc文档结构 实践案例 演示如何将自定义业务表数据打包为IDoc 详细说明IDoc结构定义步骤(段、基本类型、消息类型)

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 318

FP16、BF16、INT8、INT4精度模型加载所需显存以及硬件适配的分析

本文主要介绍了FP16、INT8、INT4精度模型加载占用显存大小的分析,希望对学习大语言模型的同学们有所帮助。 文章目录 1. 前言 2. 模型加载显存占用大小 3. 不同精度是否与硬件适配

herosunly的博客 23万+

[Warning] multi-character character constant [-Wmultichar]——字符+空格导致输出错误

在使用Devc++做题的时候遇到了如下的【警告】: [警告]多字符字符常量〔Wmultichar〕 (题目是http://codeup.cn/problem.php?cid=100000583&amp;pid=1) 代码如下: #include&lt;iostream&gt; #include&lt;stdlib.h&gt; using namespace std; int fib(in...

天啊野 5万+

华为OD技术面真题 - Python开发 - 1

汇总华为OD技术面八股Python八股,高频技术真题并提供详细解答。

qq_45776114的博客 1717

多字节字符串与宽字符串的转换

多字节字符串与宽字符串的转换可使用C API者Win32 API.C API: mbstowcs,wcstombsWin32 API: MultiByteToWideChar, WideCharToMultiByte下面着重介绍Win32 API的用法,C API的用法较为简单可参照Win32 API。首先是WideCharToMultiByte通常你需要配置4个参数(其他参数如是使用即可),红色标记的部分。依次是源宽字符串,需要转换的长度(-1,则为转换整个字符串),目标多字节字符串,目标缓冲区长度。返回

tianmo2010的专栏 4371

Python爬虫反爬:突破Cloudflare 5秒盾(免费方案,小红书/知乎可用)

这套方案的核心优势是“真实模拟+免费无门槛”无需付费代理、无需复杂JS解密,仅用playwright模拟真实浏览器,即可突破Cloudflare 5秒盾;适配小红书、知乎、豆瓣等主流平台,修改配置即可复用;兼顾易用性和稳定性,新手也能快速上手,企业级场景可通过IP轮换、异步爬取进一步优化。“模拟人类行为到底”——Cloudflare的反爬本质是区分“机器”和“人类”,只要爬虫的浏览器指纹、行为特征与人类一致,就能稳定绕过限制。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 2880

RK3568平台开发系列讲解:UBOOT详细介绍

U-boot是一款广泛使用的开源引导加载程序,支持多种嵌入式操作系统和处理器架构。其主要功能包括系统上电时的硬件初始化、引导操作系统内核等。U-boot的引导流程通常包括Boot Code、idbloader.img、uboot.img、boot.img和rootfs.img等步骤。启动U-boot时,通过Debug串口连接板卡,按下ctrl+c键可进入U-Boot命令行模式。U-boot启动过程中会执行一系列初始化操作,如打印系统信息、初始化内存、加载内核设备树、初始化I2C、PMIC电源芯片、DRM框架

内核笔记 808

C++宽字符与普通字符的转换方法

<br />//把字符串转换成宽字符串 wstring string2Wstring(string sToMatch) { #ifdef _A_WIN int iWLen = MultiByteToWideChar( CP_ACP, 0, sToMatch.c_str(), sToMatch.size(), 0, 0 ); // 计算转换后宽字符串的长度。(不包含字符串结束符) wchar_t *lpwsz = new wchar_t [iWLen + 1]; MultiBy

stephen_yin的专栏 1万+

2025华为OD机试真题+全流程解析+备考攻略+面试技巧+机考经验分享+Java/python/JS/C++/C语言实现

本专栏包含华为 OD 机试最新的 A卷+B卷+C卷+D卷+E卷题库,为全网最全、最新题库,500+真题。每一篇文章都包含了题目描述、解题思路以及实现代码。同时免费提供最新的在线OJ 刷题系统。已有上百名小伙伴通过刷真题题库通过了华为od机考,拒绝一切形式的代考,替考行为!!!以下是本专栏详细内容介绍:本专栏提供在线OJ刷题系统:OJ题库OJ系统注册&使用教程:OJ使用教程其他专栏以及答疑介绍:50+ 高频面试手撕真题,已有上百位小伙伴高频认证。1:机试没过,半年的冷冻期。2:已经订阅过我专栏的同学,推荐新人

MISAYAONE的博客 2225

Windows核心思想-宽字符与窄字符(Unicode和ASCII)

目录 基本概念 演示 基本概念 宽字符:Unicode字符,双字节 窄字符:ASCII字符,单字节 Windows中所有的底层函数都是Unicode编码 COM组件必须使用Unicode编码(COM组件可以理解为DLL,主要是用于代码重用); 比如在Windows API中: FindWindowW和FindWindowA W的意思为wide(宽)...

IT1995的博客 8594

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

宽字符与Unicode

在C语言中,我们使用char来定义字符,占用一个字节,最多只能表示128个字符,也就是ASCII码中的字符。计算机起源于美国,char 可以表示所有的英文字符,在以英语为母语的国家完全没有问题。 但是世界上存在很多不同的语言,例如汉语、汉语、日语等有成千上万个字符,需要用多个字节来表示,称之为宽字符(Wide Character)。Unicode 是宽字符编码的一种,已经被现代计算机指定

芝麻软件工作室的专栏 3353

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

CString string 的相互转化,宽字符,多字符的转换

多字符宽字符的相互转换,学习windows无法跳跃的鸡肋。

点水穿石,不只是一种信念,还有一种无畏的勇气。 2432

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

多字节和宽字符之间的转换方法

在Windows中,宽字符字符串使用的是UTF16编码,而多字节字符串使用的是GB2312编码,两者无法进行直接赋值。所以,在某些情况下需要对它们进行转换。本人大致用过以下几种转换方法。 使用Windows提供的WideCharToMultiByte系列函数进行转换 使用WideCharToMultiByte可以将宽字符转换成多字节,而使用MultiByteToWideChar可以

NullPointerException 3327

宽字符至多字符的相互转换方法

1. unicode宽字符至多字符的转换char *w2c(char *pcstr,const wchar_t *pwstr, size_t len){    int nLength=wcslen(pwstr);        //获取转换后的长度    int nBytes = WideCharToMultiByte( // Bytes required fo

newger_66的专栏 390

Unicode编码与C语言宽字符

文章目录1.ASCII、ANSI、Unicode都是什么?2.为什么需要宽字符?3.C语言如何处理宽字符?4.Windows中的字符串函数 1.ASCII、ANSI、Unicode都是什么? ASCII: American Standard Code for Information Interchange即美国信息交换标准代码,是一种非常常用的编码方式。标准ASCII码使用7位二进制数的组合来表示所有的大写和小写字母,数字0 到9、标点符号,以及在美式英语中使用的特殊控制字符,一共128个。标准ASC

qq_51619737的博客 2584

Mingw 宽字符 中文乱码 Windows API 调用出错

Mingw 宽字符 中文乱码 Windows API 调用出错

qiushangren的专栏 762

windows编程02-宽字符与Unicode

宽字符与Unicode 在C语言中,我们使用char来定义字符,占用一个字节,最多只能表示128个字符,也就是ASCII码中的字符。计算机起源于美国,char 可以表示所有的英文字符,在以英语为母语的国家完全没有问题。 但是世界上存在很多不同的语言,例如汉语、汉语、日语等有成千上万个字符,需要用多个字节来表示,称之为宽字符(Wide Character)。Unicode 是宽字符编码的一种,已经被...

FairLikeSnow的博客 443

C++ 宽字符 窄字符 char wchar

目录wchar_t和char区别宽字符string和wstring的区别 wchar_t和char区别 参考链接 宽窄字符是与一个字符所占的字节数有关,如果一个字符只占一个字节,那么它就是窄字符,一个宽字符通常占2个字节。 在c/c++/objective c中,如果你想把一个窄字符(例如ASCII 字符)表示为宽字符通常的做法是使用wchar来取代char,例如: wchar t = 'A'; wchar_t * p = L"Hello!" ; 这里每一个字符都占了2个字节,并且采用了UTF16编码。

S676951的博客 2217
上一篇: Visual Assist X 快捷键
下一篇: 常用的时间类型转换
hhgo
博客等级 码龄15年 1粉丝 10原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值