Windows核心思想-宽字符与窄字符(Unicode和ASCII)
生活随笔
收集整理的這篇文章主要介紹了
Windows核心思想-宽字符与窄字符(Unicode和ASCII)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
目錄
?
?
基本概念
演示
?
基本概念
寬字符:Unicode字符,雙字節
窄字符:ASCII字符,單字節
?
Windows中所有的底層函數都是Unicode編碼
COM組件必須使用Unicode編碼(COM組件可以理解為DLL,主要是用于代碼重用);
?
比如在Windows API中:
FindWindowW和FindWindowA
W的意思為wide(寬)
A的意思為ASCII
?
在Windows.h中有一個UNICODE宏
底層調用寬字節版本
窄字節版本僅作編碼轉換
?
下面是2個字符串轉換的函數:
MultiByteToWideChar UINT uCodePage //代碼頁 DWORD dwFlags //保留為0 PCSTR pMultibyteStr //待轉換字符 int cchMultiByte //字符串長度(-1獲取待轉換字符串長度) PWSTR pWideCharStr //轉換后存儲的緩存區 int cchWideChar //緩沖大小 WideCharToMultiByte UINT uCodePage //代碼頁號 DWORD dwFlags //保留為0 PCSTR pWidebyteStr //待轉換字符串 int cchWideByte //字符串長度(-1獲取待轉換字符串長度) int cchMultiChar //緩沖區大小 PCSTR pDefaultChar //轉換失敗備用字符 PBOOL pfUsedDefaultChar //轉換是否成功?
這里順便提一下,在Windows.h中有很多微軟自定義的宏
比如
BOOL,他實際上是typedef int BOOL
HANDLE,他實際上是typedef void *HANDLE
?
?
演示
下面舉個窄字符轉成寬字符的例子!
程序運行截圖如下:
#include <stdio.h> #include <Windows.h>bool UnicodeToAnsi(const char *pAnsi, wchar_t **pUnicode){ //const CHAR *pAnsi, WCHAR *pUnicodeBOOL a;HANDLE b;if(nullptr == pAnsi){return false;}//如果有一個size變量,那么會讓人知道這是一個sizeint 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); //窄字符 區別字符串為 \0printf("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://github.com/fengfanchen/CAndCPP/tree/master/UnicodeAndASCII
總結
以上是生活随笔為你收集整理的Windows核心思想-宽字符与窄字符(Unicode和ASCII)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Spring Boot笔记-通过反射获取
- 下一篇: OllyDbg笔记-对标志寄存器中ZF的