日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > windows >内容正文

windows

Unicode——Windows核心编程学习手札之二

發(fā)布時(shí)間:2025/4/16 windows 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Unicode——Windows核心编程学习手札之二 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Unicode

——Windows核心編程學(xué)習(xí)手札之二

處理軟件本地化的核心在于處理不同的字符集。文本串一直作為一系列單字節(jié)字符進(jìn)行編碼,并在結(jié)尾處放上一個(gè)零,當(dāng)調(diào)用strlen函數(shù)時(shí),獲取以/0結(jié)尾的單字節(jié)字符數(shù)組中返回字符的數(shù)目。但各地的文字和書(shū)寫(xiě)規(guī)則單字節(jié)(256個(gè)字符)可能不夠使用,因此需要雙字節(jié)字符集(DBCS)的支持。雙字節(jié)字符集,字符串中的每個(gè)字符可以包含一個(gè)字節(jié)或兩個(gè)字節(jié),對(duì)于程序員來(lái)說(shuō)是個(gè)難題。

為此,Unicode標(biāo)準(zhǔn)被提出來(lái)。Unicode字符串中的所有字符都是16位的(兩個(gè)字節(jié))。也就是說(shuō)固定了雙字節(jié)來(lái)表示一個(gè)字符。Unicode16位值表示每個(gè)字符,總共可以得到65000個(gè)字符,能夠滿(mǎn)足對(duì)各地不同的文字和書(shū)寫(xiě)規(guī)則字符所需。Unicode字符集具有:容易在不同語(yǔ)言之間進(jìn)行數(shù)據(jù)交換;能夠分配支持所有語(yǔ)言的單個(gè)二進(jìn)制EXE文件或DLL文件;提高應(yīng)用程序的效率。

Windows2000是使用Unicode從頭開(kāi)發(fā)進(jìn)行,用于創(chuàng)建窗口、顯示文本、進(jìn)行字符串操作等的所有核心函數(shù)都需要Unicode字符串。如果調(diào)用任何一個(gè)Windows函數(shù)并給它傳遞一個(gè)ANSI字符串,系統(tǒng)首先會(huì)先該字符串轉(zhuǎn)換成Unicode,然后將Unicode傳遞給操作系統(tǒng)。如調(diào)用CreateWindowEx函數(shù),并傳遞類(lèi)名字和窗口標(biāo)題文本的非Unicode字符串,那么CreateWindowEx必須分配內(nèi)存塊(在進(jìn)程默認(rèn)堆中),將非Unicode字符串轉(zhuǎn)換成Unicode字符串,并將結(jié)果存儲(chǔ)到分配的內(nèi)存塊中,然后調(diào)用Unicode版的CreateWindowEx函數(shù)。由于系統(tǒng)必須執(zhí)行這些轉(zhuǎn)換操作,這些渙渙操作是在你看不見(jiàn)的情況下完成,需要更多的內(nèi)存,并且運(yùn)行速度較慢,因此開(kāi)發(fā)基于Windows2000操作系統(tǒng)的應(yīng)用程序最后從頭開(kāi)始就使用Unicode,可以使應(yīng)用程序更加有效地運(yùn)行。

Windows98繼承16Windows操作系統(tǒng)特性,不是用Unicode來(lái)處理,不過(guò)同樣可以處理Unicode字符和字符串,如同Windows2000處理非Unicode字符串一樣。如調(diào)用CreateWindowEx函數(shù)并將Unicode字符串傳遞給它,就必須明確分配緩存以便執(zhí)行從UnicodeANSI字符串的轉(zhuǎn)換操作,當(dāng)調(diào)用CreateWindowEx函數(shù)返回時(shí),就釋放臨時(shí)緩存。

Windows2000既支持Unicode也支持ANSI,可以為任意一種開(kāi)發(fā)應(yīng)用程序;而Windows98只支持ANSI,只能為ANSI開(kāi)發(fā)應(yīng)用程序。Microsoft在將COM16Windows轉(zhuǎn)換成Win32時(shí),將需要字符串的所有COM接口方法改成只能接受Unicode字符串,因?yàn)?/span>COM通常用于不同組件間進(jìn)行通信,Unicode是傳遞字符串最佳手段。MicrosoftUnicode設(shè)計(jì)了Windows API可以盡量減少對(duì)代碼的影響。在編寫(xiě)單個(gè)源代碼文件,可以通過(guò)定義宏(UNICODE_UNICODE)確定使用或不使用Unicode來(lái)進(jìn)行編譯。

為了利用Unicode字符串,C運(yùn)行期庫(kù)定義了一些數(shù)據(jù)類(lèi)型。標(biāo)準(zhǔn)的C頭文件String.h中定義了一個(gè)Unicode字符數(shù)據(jù)類(lèi)性,名字為wchar_t的數(shù)據(jù)類(lèi)型:

Typedef unsigned short wchar_t

如你要?jiǎng)?chuàng)建一個(gè)緩存,用于存放最多為99個(gè)字符的Unicode字符串和一個(gè)結(jié)尾為零,可以使用下面語(yǔ)句:

wchar_t szBuffer[100]

該語(yǔ)句創(chuàng)建了一個(gè)由100個(gè)16位值組成的數(shù)組。標(biāo)準(zhǔn)的C運(yùn)行期庫(kù)字符串函數(shù),如strcpystrchrstrcat等只能對(duì)ANSI字符串進(jìn)行操作,不能正確處理Unicode字符串。因此,ANSI C也設(shè)計(jì)了一組補(bǔ)充函數(shù)用于出來(lái)Unicode,如char *strcat(char *,const char*)處理ANSI字符串,對(duì)應(yīng)的Unicode字符串函數(shù)是wchar_t *wcscat(wchar_t *,const wchar_t),一般所有的Unicode函數(shù)均以wcs開(kāi)頭。ANSI C規(guī)定,C運(yùn)行期庫(kù)支持Unicode字符和字符串。若要建立支持ANSI/UNICODE通用代碼,需要包含TChar.h文件而非String.h文件。TChar.h包含用在源代碼中的一組宏,而不直接調(diào)用str函數(shù)或wcs函數(shù)。如果在編譯文件中定義了_UNICODE,這些宏就用wcs組函數(shù),如沒(méi)有定義,則引用str這組宏。如在TChar.h中有一個(gè)宏_tcscpy,如在頭文件中沒(méi)有定義_UNICODE,那_tcscpy就擴(kuò)展為ANSIstrcpy函數(shù),如定義了,則擴(kuò)展為Unicodewcscpy函數(shù)。

Windows頭文件定義的Unicode數(shù)據(jù)類(lèi)型有:WCHAR Unicode字符串;PWSTR 指向Unicode字符串的指針;PCWSTR 指向一個(gè)恒定的Unicode字符串的指針。Windows頭文件也定義了ANSIUNICODE通用數(shù)據(jù)類(lèi)型PTSTRPCTSTR,這些數(shù)據(jù)類(lèi)型既可以指ANSI字符串,也可以指Unicode字符串,取決于編譯程序模塊是否定義了UNICODE宏,這里宏和C運(yùn)行期頭文件定義的_UNICODE宏不一樣。

Windows還提供一組字符串操作函數(shù),與C運(yùn)行期字符串函數(shù)(如strcpywcscpy)相似,但這些函數(shù)是操作系統(tǒng)的組成部分,操作系統(tǒng)的許多組件都使用這些函數(shù)而不使用C運(yùn)行期庫(kù)。建立最好使用操作系統(tǒng)函數(shù)而不使用C運(yùn)行期庫(kù)字符串函數(shù),這有助于提高應(yīng)用程序的運(yùn)行性能,因?yàn)椴僮飨到y(tǒng)字符串函數(shù)常常被大型應(yīng)用程序如操作系統(tǒng)的外殼進(jìn)程Explorer.exe所使用,由于這些函數(shù)使用多,在你應(yīng)用程序運(yùn)行時(shí),它們很可能已經(jīng)被裝入了RAM中。

開(kāi)發(fā)符合ANSIUnicode的應(yīng)用程序,需要遵循的原則:將文本串視為字符數(shù)組而不是chars數(shù)組或字節(jié)數(shù)組;將通用數(shù)據(jù)類(lèi)型(如TCHARPTSTR)用于文本字符和字符串;將顯示數(shù)據(jù)類(lèi)型(如BYTEPBYTE)用于字節(jié)、自己指針和數(shù)據(jù)緩存;將TEXT宏用于原義字符和字符串;執(zhí)行全局性替換(例如用PTSTR替換PSTR);修改字符串運(yùn)算問(wèn)題。如果開(kāi)發(fā)包含C運(yùn)行期庫(kù)頭文件,Unicode宏定義為_UNICODE,如果定義了則編譯時(shí)如果是通用數(shù)據(jù)類(lèi)型和函數(shù)則選擇執(zhí)行Unicode函數(shù),同樣如果在Windows頭文件中定義UNICODE宏處理是一樣。要開(kāi)發(fā)出符合ANSIUnicode的應(yīng)用程序需要在代碼中用通用數(shù)據(jù)類(lèi)型和函數(shù)來(lái)處理字符和字符串,如果在代碼中直接使用了ANSI的函數(shù)和數(shù)據(jù)類(lèi)型,那么就算宏定義了Unicode也將只能處理ANSI字符和字符串,對(duì)于Unicode是一樣。考慮到利用宏定義就可以實(shí)現(xiàn)ANSIUnicode的應(yīng)用程序切換。

這里做了個(gè)代碼測(cè)試,在Visual C++6.0開(kāi)發(fā)環(huán)境中,建立一個(gè)Win32 Console Application,并在Project Settings中的C/C++頁(yè)Preprocessor definitions里添加UNICODE的宏,同時(shí)在主文件中加入頭文件#include <windows.h>并執(zhí)行如下代碼觀察:

#include "stdafx.h"

#include <windows.h>

int main(int argc, char* argv[])

{

?????? TCHAR ch[]=TEXT("ANSI or Unicode");

?????? int it=sizeof(ch);

?????? int it1=sizeof(TCHAR);

?????? int? ilen=sizeof(ch)/sizeof(TCHAR);

?????? printf("%d,%d,%d/n",it,it1,ilen);

?????? return 0;

}

可發(fā)現(xiàn)it=32it1=2ilen=16;回到Project Settings中的C/C++頁(yè)Preprocessor definitions中取消UNICODE宏,再次執(zhí)行代碼發(fā)現(xiàn)it=16it1=1ilen=16;這就說(shuō)明了宏定義對(duì)ANSI/UNICODE通用數(shù)據(jù)類(lèi)型的取決作用,如果定義了UNICODE宏,那么TCHAR就是char類(lèi)型,單字節(jié),沒(méi)有定義UNICODE宏則是wchar_t,雙字節(jié)。

???????????????????????? 如非

???????????????????????????? 2008-11-25

總結(jié)

以上是生活随笔為你收集整理的Unicode——Windows核心编程学习手札之二的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。