当前位置:   article > 正文

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

宽字符和窄字符的区别

目录

 

 

基本概念

演示


 

基本概念

宽字符:Unicode字符,双字节

窄字符:ASCII字符,单字节

 

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

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

 

比如在Windows API中:

FindWindowW和FindWindowA

W的意思为wide(宽)

A的意思为ASCII

 

在Windows.h中有一个UNICODE宏

底层调用宽字节版本

窄字节版本仅作编码转换

 

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

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

 

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

比如

BOOL,他实际上是typedef int BOOL

HANDLE,他实际上是typedef void *HANDLE

 

 

演示

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

程序运行截图如下:

  1. #include <stdio.h>
  2. #include <Windows.h>
  3. bool UnicodeToAnsi(const char *pAnsi, wchar_t **pUnicode){ //const CHAR *pAnsi, WCHAR *pUnicode
  4. BOOL a;
  5. HANDLE b;
  6. if(nullptr == pAnsi){
  7. return false;
  8. }
  9. //如果有一个size变量,那么会让人知道这是一个size
  10. int nSize = sizeof(pAnsi);
  11. size_t szAnsi = MultiByteToWideChar(CP_ACP, 0, pAnsi, -1, nullptr, 0);
  12. *pUnicode = new wchar_t[szAnsi];
  13. if(szAnsi == MultiByteToWideChar(CP_ACP, 0, pAnsi, szAnsi, *pUnicode, szAnsi)){
  14. return true;
  15. }
  16. return false;
  17. }
  18. int main(int *argc, int *argv[]){
  19. char *szDemo = "abcd"; //单字节 窄字节 ASCII字节
  20. wchar_t *wszDemo = L"abcd"; //双字节 宽字节 Unicode字节
  21. wchar_t szOut[MAXBYTE] = {0}; //这种写法有一定的危险,溢出攻击
  22. //窄字符转宽字符
  23. MultiByteToWideChar(CP_ACP, 0, szDemo, strlen(szDemo), szOut, strlen(szDemo));
  24. printf("szDemo: %s\n", szDemo); //窄字符 区别字符串为 \0
  25. printf("szOut: %ws\n", szOut); //宽字符 区分字符串为 0000
  26. //可以先获取长度在进行分配,现在来封装一下
  27. wchar_t *szOut2 = nullptr;
  28. UnicodeToAnsi(szDemo, &szOut2);
  29. printf("szDemo: %s\n", szDemo);
  30. printf("szOut2: %ws\n", szOut2);
  31. delete szOut2;
  32. getchar();
  33. return 0;
  34. }

程序运行截图如下:

项目打包下载地址:

https://github.com/fengfanchen/CAndCPP/tree/master/UnicodeAndASCII

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/488571
推荐阅读
相关标签
  

闽ICP备14008679号