Windows核心思想-宽字符与窄字符(Unicode和ASCII)
发布日期:2021-06-30 11:01:01 浏览次数:2 分类:技术文章

本文共 1788 字,大约阅读时间需要 5 分钟。

目录

 

 


 

基本概念

宽字符:Unicode字符,双字节

窄字符:ASCII字符,单字节

 

Windows中所有的底层函数都是Unicode编码

COM组件必须使用Unicode编码(COM组件可以理解为DLL,主要是用于代码重用);

 

比如在Windows API中:

FindWindowW和FindWindowA

W的意思为wide(宽)

A的意思为ASCII

 

在Windows.h中有一个UNICODE宏

底层调用宽字节版本

窄字节版本仅作编码转换

 

下面是2个字符串转换的函数:

MultiByteToWideCharUINT uCodePage		//代码页DWORD dwFlags		//保留为0PCSTR pMultibyteStr	//待转换字符int cchMultiByte	//字符串长度(-1获取待转换字符串长度)PWSTR pWideCharStr	//转换后存储的缓存区int cchWideChar		//缓冲大小
WideCharToMultiByteUINT uCodePage		//代码页号DWORD dwFlags		//保留为0PCSTR pWidebyteStr	//待转换字符串int cchWideByte		//字符串长度(-1获取待转换字符串长度)int cchMultiChar	//缓冲区大小PCSTR pDefaultChar	//转换失败备用字符PBOOL pfUsedDefaultChar	//转换是否成功

 

这里顺便提一下,在Windows.h中有很多微软自定义的宏

比如

BOOL,他实际上是typedef int BOOL

HANDLE,他实际上是typedef void *HANDLE

 

 

演示

下面举个窄字符转成宽字符的例子!

程序运行截图如下:

#include 
#include
bool UnicodeToAnsi(const char *pAnsi, wchar_t **pUnicode){ //const CHAR *pAnsi, WCHAR *pUnicode BOOL a; HANDLE b; if(nullptr == pAnsi){ return false; } //如果有一个size变量,那么会让人知道这是一个size int nSize = sizeof(pAnsi); size_t szAnsi = MultiByteToWideChar(CP_ACP, 0, pAnsi, -1, nullptr, 0); *pUnicode = new wchar_t[szAnsi]; if(szAnsi == MultiByteToWideChar(CP_ACP, 0, pAnsi, szAnsi, *pUnicode, szAnsi)){ return true; } return false;}int main(int *argc, int *argv[]){ char *szDemo = "abcd"; //单字节 窄字节 ASCII字节 wchar_t *wszDemo = L"abcd"; //双字节 宽字节 Unicode字节 wchar_t szOut[MAXBYTE] = {0}; //这种写法有一定的危险,溢出攻击 //窄字符转宽字符 MultiByteToWideChar(CP_ACP, 0, szDemo, strlen(szDemo), szOut, strlen(szDemo)); printf("szDemo: %s\n", szDemo); //窄字符 区别字符串为 \0 printf("szOut: %ws\n", szOut); //宽字符 区分字符串为 0000 //可以先获取长度在进行分配,现在来封装一下 wchar_t *szOut2 = nullptr; UnicodeToAnsi(szDemo, &szOut2); printf("szDemo: %s\n", szDemo); printf("szOut2: %ws\n", szOut2); delete szOut2; getchar(); return 0;}

程序运行截图如下:

项目打包下载地址:

转载地址:https://it1995.blog.csdn.net/article/details/89668217 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:Qt文档阅读笔记-FileDialog QML Type官方解析与实例
下一篇:系统架构师学习笔记-论文摘要部分的写法

发表评论

最新留言

表示我来过!
[***.240.166.169]2024年04月22日 07时22分52秒