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)实际开发中应合理处理内存和编码转换问题。掌握宽字符对开发国际化软件至关重要。 阅读详情

相关推荐

语音增强评价指标全解析:从MOS到eSTOI的实战指南

本文全面解析了语音增强领域的核心评价指标,包括主观评价的黄金标准MOS,以及PESQ、STOI、eSTOI等关键客观指标。文章详细阐述了各指标的原理、适用场景与实战计算方法,并提供了Python代码示例,旨在帮助开发者和研究者建立科学的评估体系,以平衡语音可懂度与音质,从而优化算法效果。

yhn456789的博客 1198

Windows下多字节字符转宽字符

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

caz28的专栏 593

图形学基础|球谐光照(Spherical Harmonics Lighting)

球谐光照(Spherical Harmonics Lighting) 文章目录球谐光照(Spherical Harmonics Lighting)一、前言二、球谐函数2.1 基函数2.2 投影与重建2.3 应用三、漫反射环境光3.1 IrradianceMap3.2 数学推导3.3 实践参考博文 一、前言 在学习图形渲染的过程中,一直對球谐函数(球谐光照)有一点了解,但没有亲手实现过。 关于球谐函数的数学概念是比较复杂的,笔者也实在无法完全理解,这篇文章只能从做东西的角度来说,公式是如何和代码进行对应的。

【黑键】 1万+

[警告] 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

[原创]Linux 802.11n CSI tool安装教程(亲测可用)

Linux 802.11n CSI tool安装教程 前言 网上关于Intel5300 CSI tool的教程繁多,实际有效的可以说极少,各种疏漏错误。装的时候被坑无数次,终于调通。其实装这个工具并不太难,但是很多人把它弄得极其复杂,所以写这篇博客来帮助和我有一样困扰的人。我基本沿用的是官方文档旧版本的安装方案,针对其冗杂之处做了大量改进。 旧版安装教程: http://dhalperi....

u014645508的博客 4万+

别再死记硬背了!一张图搞懂无刷电机半桥与全桥驱动的核心差异(附避坑指南)

本文深入解析无刷直流电机的半桥与全桥驱动方式的核心差异,提供直观对比与选型指南。半桥驱动结构简单、成本低,适合低要求场景;全桥驱动性能优越但复杂,适用于高精度控制。文章还包含实战避坑指南,帮助工程师优化驱动方案选择与应用。

weixin_29290947的博客 319

[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万+

基于Ultralytics RT-DETR的工业缺陷检测实战:从NEU-DET数据集准备到模型部署

本文详细介绍了基于Ultralytics框架和RT-DETR模型进行工业缺陷检测的完整实战流程。内容涵盖从NEU-DET数据集准备、YOLO格式转换、环境配置,到模型训练、关键参数调优、性能验证与可视化分析,最后提供了ONNX等格式的模型部署方案,为工业质检场景提供了一套高效、可落地的AI解决方案。

weixin_29168393的博客 339

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

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

tianmo2010的专栏 4371

TMP112/TMP102温度传感器驱动开发与嵌入式实战

数字温度传感器是嵌入式系统环境感知的核心器件,其通过I²C等标准总线实现高精度、低功耗测温。原理上依赖ΔΣ模数转换与二进制补码数据格式,结合寄存器配置实现模式控制、阈值报警与功耗管理。技术价值体现在±0.5°C级精度、1μA级静态电流及SOT-563超小封装带来的系统集成优势。广泛应用于工业MCU热监控、电池物联网终端、医疗电子温度补偿及汽车ECU板级测温等场景。本文围绕TMP112/TMP102展开,深入解析寄存器协议、硬件接口约束、HAL驱动分层设计、FreeRTOS任务调度及生产级校准方法,覆盖从芯片

weixin_35756690的博客 674

Hyperledger Fabric 网络搭建详解

写在前面:博主也是因为一些原因刚刚入坑区块链,我认为在我们入门新技术的时候,入门总是最困难的部分,只要入门了,后面学习起来就会越来越轻松,在网上找了很多文章,我觉得大多条理不是很清楚。本文章会详细介绍fabric(v1.0)环境部署,以及在搭建过程我遇到一些问题及解决方案,希望可以帮助到你们。 博主环境机器:VMware15 Ubuntu16.04 fabric(v1.0)环境部署一、必备软件安装1.ubuntu环境安装2.Go语言3.Docker安装4. Docker-Compose 安装二、Fa.

林中有神君 1万+

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万+

BES 平台 SDK之 美格信Dongle 连接

最近项目到了试产阶段,需要用到美格信的Dongel 来测试ANC 相关功能。在此简单介绍下如何连接Dongel 的操作步骤。

谢文浩博客 925

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

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

IT1995的博客 8594

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

宽字符与Unicode

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

芝麻软件工作室的专栏 3353

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

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

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

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

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

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

在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、付费专栏及课程。

余额充值