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 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
表示我来过!
[***.240.166.169]2024年04月22日 07时22分52秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
Linux png转jpg (convert命令)
2019-04-30
NAS (Network Attached Storage 网络附属存储)
2019-04-30
Ubuntu更新后终端中字体的颜色全是白色
2019-04-30
Ninja
2019-04-30
lmdb数据库的读取与转换(一) —— 基本操作
2019-04-30
opencv相关操作(cv2) (python)
2019-04-30
lmdb数据库的读取与转换(二) —— 数据集操作
2019-04-30
Lua语言
2019-04-30
Python __doc__获得模块的文档字符串内容
2019-04-30
Python sys.path和模块搜索路径
2019-04-30
github.io网页无法打开(连接不是私密连接)
2019-04-30
git submodule
2019-04-30
linux中source、sh、bash、./有什么区别
2019-04-30
vscode git
2019-04-30
基于MATLAB的二进制数字调制与解调信号的仿真——2FSK
2019-04-30
基于MATLAB的二进制数字调制与解调信号的仿真——2PSK
2019-04-30
基于MATLAB的模拟调制信号与解调的仿真——AM
2019-04-30
基于MATLAB的模拟调制信号与解调的仿真——DSB
2019-04-30
基于MATLAB的模拟调制信号与解调的仿真——SSB
2019-04-30