編寫符合ANSI和Unicode的應用程式

2021-09-19 12:36:07 字數 3189 閱讀 8031

世界真的很奇妙,分久必合,合久必分。

計算機發展到今天,多國之間的交流日益廣泛,軟體本地化是重大趨勢。如果減少本地化工作就是一件值得考慮的事情。

軟體本地化要解決的真正問題就是如何來處理不同的字符集。要知道,單位元組字元是乙個8位的資料來表示的。 因此,它最多能表示256個字元。 全世界那麼多個國家,256個怎麼夠。 因此人們提出了雙位元組(dbcs)來解決這個問題。

單位元組與雙位元組字符集 ----->多字符集

當表示英文或某些符號的時候,就採用乙個位元組來表示,而當表示日文,中文等字元的時候,就採用兩個位來表示。 可想而知,我們不可以再像操作單位元組字元那樣通過 pchar++;來遍歷每乙個字元。

為此,ms提供了charnext,charpre作為遍歷工具。 不過這些函式讓人頭疼。

unicode應運而生。它採用了兩個位元組來表示乙個字元,不管是漢字還是英文。 統一一樣。 兩個位元組即為16位,表示的數有65536個。 而世界各國的符號加起來才用了35000個左右,困此,足夠了。

為什麼我們要使用unicode

當開發應用程式時,當然應該考慮利用unicode的優點。即使你不打算讓你的程式本地化,開發時也應該將unicde放在心上,肯定可以簡化你將來的**轉換工作。此外,unicde還有以下功能。

1、可以很容易地在不同語言之彰進行資料交換。

2、使你能夠分配支援所有語言的單個二進位制.exe檔案或dll檔案。

3、提高應用程式的執行效率。

windows 2000上的unicode

windows 2000是採用unicode從頭開發的。 所有與字串相關的操作都會用到unicode。當然,windows 2000的api都接受多字符集和unicode字符集的引數。但是,只有unicode的函式是實現了的。而多字符集的函式則是先將unicode字符集轉換成unicode,然後再交給unicode的函式處理。可知,採用unicode呼叫api,速度會快不少。 同樣,返回字串的api函式也做同樣的轉換工作。

系統中會存在兩套api 拿createfile為例。則有如下定義

#ifdef unicode

#define createfilew createfile

#else

#define createfilea  createfile

#endif

當我們呼叫 createfile的時候,系統便會根據你是否要unicode而選擇正常的函式。

而當你呼叫createfilea時,則有

呼叫createfilea---> 將多字符集引數轉換為unicode ---> 呼叫 createfilew

白白地多了轉換工作。因此,採用unicode程式設計,可以提高效率。  

還有一些關於windows 98的就不介紹了。。需要知道的就是,win 98不支援unicode,所以,強制呼叫w結尾的函式再用getlasterror()取得錯誤資訊,你會發現提示你此函式沒有實現。

windows ce則是完完全全的unicode作業系統,不支援ansi.....

如何使用unicode

資料型別

為了和ansi有所區別,unicode版本的資料型別顯然會不一樣.

char   wchar_t

而wchar_t的定義為 typedef unsigned shot wchar_t

可見,它是16位的。

而對於常用的字串操作函式,對比如下

strcpy  wcscpy

strcat wcscat

str 被換成了wcs 即 wide  character string的縮寫

上面是c執行期庫的定義,由於ms提供的c執行期庫與ansi標準是一樣的。所以上面的寬字元操作依然對win 98有效。

對於unicode的使用,我們則不能直接使用上面的函式,因為這樣的話,ansi/unicode原始碼轉換時你會哭掉。

於是,我們應該使用像

#ifdef unicode

#define _strcpy  wcscpy

#else

#define _strcpy  strcpy

#endif

這樣的巨集來使用每乙個函式,而 tchar.h 標頭檔案已經幫我們做到了。只需包含它,並使用正確的經過巨集控制的函式名和型別。就可以很輕鬆地實現。。。

對於字串的賦值。

char* p = "ook";

wchar_t *p = "ook";//錯誤

而應該是

wchart_t *p = l"ook";//l表示寬字元。

當然,我們也不能直接這樣用。而是要用 text 巨集

用法如下 tchar *p = text("ook");

定義類似於下面這樣。

#ifdef unicode

typedef wchar_t tchar

#define text(x)  l##x

#else

typedef char tchar

#define text(x)

#endif

這樣就能正確對應了。

總結一下編寫支援ansi/unicode編譯的原碼規則。

#將文字串視為字元陣列,而不是char陣列或byte陣列。(因為tchar的長度不固定)

#將通用資料型別(tchar,ptstr)用於文字字元和字串

#將顯式資料型別(byte,pbyte)用於位元組,位元組指標和資料快取

#將text巨集用於原義字元和字串。

#執行全域性性替換(例如用ptstr替換pstr)

#修改字串運算問題。例如計算陣列大小時,應該用sizeof(szbubffer)/szbuffer[0] ;

#include #include #include #include //寬位元組 bool stringreversw(pwstr pwchar) { pwstr pendstr = pwchar+wcslen(pwchar)-1; wchar pchar; while(pwchar此程式便支援ansi/unicode,並且輸出無異常。 可以將stringrevers_(pstr);遮蔽,將 //stringrevers(pstr);開啟,並在ansi/unicode下編譯看效果。 另外,輸出到控制台的結果,也說明了使用的字長不一樣。。。

關於用到的兩個轉換函式,可以查msdn。

總結完畢。。。打完收工。!!!!

posted @

2010-06-24 23:00

麒麟子(alex) 閱讀(

...)

編輯收藏

成為符合ANSI和UNICODE的應用程式

即使你不打算立即使用unicode,最好也應該著手將你的應用程式轉換成符合unicode的應用程式。下面是應該遵循的一些基本原則 1 將文字串視為字元陣列,而不是chars陣列或位元組陣列。2 將通用資料型別 如tchar和ptstr 用於文字字元和字串。3 將顯式資料型別 如byte和pbyte ...

python中string和Unicode的區別

首先要弄清楚的是,在python裡,string object和unicode object是兩種不同的型別。string object是由characters組成的sequence,而unicode object是unicode code units組成的sequence。string裡的char...

編寫符合Python風格的物件

1 掌握編寫pythonic code背後常用的特殊方法 2 掌握可擴充套件的格式化輸出方法 3 了解可雜湊物件的設定以及節省記憶體的 slots 物件。自定義的向量類需要支援基本的輸出,迭代,求模。從自定義向量型別入手寫出符合python風格的物件,這離不開特殊方法的支援。我們期望的自定義向量型別...