win32程式設計 二 UNICODE

2021-06-16 21:01:55 字數 3525 閱讀 1012

2.1.1 ascii  0-127 7位表示

2.1.2 ascii擴充套件碼 0-255 8位表示

**頁:通過**頁來切換對應的

2.1.3 雙位元組字符集 dbcs

使用乙個或兩個位元組表示字元.

"a中b國"

12 1 2 

a: 0x41 中:0x8051

b: 0x42 國:0x8253

1    2    3    4    5     6

0x41 0x80 0x51 0x42 0x82 0x53

a 中 b 國

這樣既包含多位元組又包含單位元組的成為多位元組編碼

2.1.4 unicode

全部使用2個位元組表示字元

"a 中 b 國"

2  2 2 2 

a: 0x0041 中:0x8051

b: 0x0042 國:0x8253

1  2  3   4    5   6   7   8

41 00  51  80   42  00  53  82

記憶體/硬碟等資源占用變大.

對程式設計支援度.

char ctext = 'a';

char * psztext = "abcd";

wchar_t ctext = 'a'

wchar_t * psztext = l"abcd";

單字字元的函式,對應有多.寬位元組的函式.

strlen wcslen mbslen

printf wprintf

為了程式中可以方便的支援的unicode和多位元組字元等,所以使用tchar來定義字元和字串.

根據_unicode巨集開關,會將tchar編譯成不同字元型別.

#ifndef _unicode

typedef char tchar

#define __t(x) x

#else

typedef wchar_t tchar

#define __t(x) l##x

#endif

使用時,要增加tchar.h標頭檔案支援,使用

_unicode 巨集開關進行編譯

cl window.c  /d_unicode

#define _unicode

#include "tchar.h"

定義方式:

tcahr * psztext = __t("abcdef"); 

**使用:使用unicode巨集開關,通知

編譯器選擇編譯的**.

#ifndef _unicode

int nlen = strlen( psztext );

#else

int nlen = wcslen( psztext );

#endif

bool writeconsole(

handle hconsoleoutput, //控制台輸出流的控制代碼

const void *lpbuffer,//輸出的字串的指標

dword nnumberofcharstowrite,//輸出的字串的長度

lpdword lpnumberofcharswritten,

// 返回已輸出字元的數量

lpvoid lpreserved ); // 保留值

**例項:

#include "stdafx.h"

#include #include #include #include #include //tchar

void ascii()

printf("\n");

//因為現在是中文字符集 而中文是雙位元組的 所以 128以後的都變成問號了

}void codepage(int ncodepage)

printf("\n");

}void c_char()

void c_wchar()

void tchar()

void printunicode(wchar_t *pszstr)

; for(byte nhigh=0;nhigh<0xff;nhigh++) }

*/}int _tmain(int argc, _tchar* argv)

每個api對多位元組字元和unicode分別有

不同的版本.

messagebox 

messageboxa  多位元組字元  

messageboxw  unicode字元

#ifdef  unicode                     

#define __text(quote) l##quote      

#else   /* unicode */               

#define __text(quote) quote         

#endif /* unicode */  

tchar * psztext = text( "abcd" );              

寬位元組到多位元組

int widechartomultibyte(

uint codepage, //**頁 cp_acp ascii碼

dword dwflags, //轉換方式  0

lpcwstr lpwidecharstr, //需要被轉換wchar位址

int cchwidechar, //需要被轉換wchar的長度  

lpstr lpmultibytestr,//用於存放轉換後的結果buff

int cchmultibyte, //buff的長度 

lpcstr lpdefaultchar,//使用的預設字串的位址   null

lpbool lpuseddefaultchar //預設字串被使用的標識 0

);多位元組到寬位元組

int multibytetowidechar(

uint codepage,// **頁

dword dwflags,// 轉換方式

lpcstr lpmultibytestr, // 需要被轉換char位址

int cchmultibyte,//需要被轉換char的長度

lpwstr lpwidecharstr,//用於存放轉換後的結果buff

int cchwidechar );//buff的長度

使用方法:

1 將要轉換的字串,傳遞給函式(cchwidechar 或者 cchmultibyte = 0),從 返回值中獲取轉換後字串的元素個數。

2 分配字串空間

3 再次呼叫函式,並將分配的空間傳遞給函式,獲取結果.

4 例子

void mymessagebox()

void multi2wide()

;void wide2multi()

;

Win32程式設計

win32 malloc函式的底層實現是win32api utf 16編碼以16位無符號整數為單位,注意是16位為乙個單位,不是乙個字元就只有16位,這個要看字元的unicode編碼處於什麼範圍而定,有可能是2個位元組,也可能是4個位元組現在機器上的unicode編碼一般就是指utf 16 以兩個位...

WIN32程式設計模板

include lresult callback wndproc hwnd,uint,wparam,lparam int winapi winmain hinstance hinstance,hinstance hprevinstance,pstr szcmdline,int icmdshow te...

win32程式設計 1

1.winmain 1 myregisterclass hinstance 註冊視窗類 2 initinstance 初始化例項 3 while getmessage msg,null,0,0 getmessage從應用程式訊息佇列取乙個訊息,當取到wm quit時,返回假 作業系統向應用程式傳送一...