ansi,dbcs,mbcs,unicode各是甚麼意思

所有的   string   類都是以C-style字符串爲基礎的。C-style   字符串是字符數組。所以我們先 介紹字符類型。這裏有3種編碼模式對應3種字符類型。

第一種編碼類型是單子節字符集(single-byte   character   set   or   SBCS)。在這種編碼模式下,所有的字符都只用一個字節表示。ASCII是SBCS。一個字節表示的0用來標誌SBCS字符串的結束。
第二種編碼模式是多字節字符集(multi-byte   character   set   or   MBCS)。一個MBCS編碼包含一些一個字節長的字符,而另一些字符大於一個字節的長度。用在Windows裏的MBCS包含兩種字符類型,單字節字符 (single-byte   characters)和雙字節字符(double-byte   characters)。由於Windows裏使用的多字節字符絕大部分是兩個字節長,所以MBCS常被用DBCS代替。
在DBCS編碼模式中,一些特定的值被保留用來表明他們是雙字節字符的一部分。例如,在Shift-JIS編碼中(一個常用的日文編碼模 式),0×81-0×9f之間和   0xe0-oxfc之間的值表示”這是一個雙字節字符,下一個子節是這個字符的一部分。”這樣的值被稱作”leading   bytes”,他們都大於0×7f。跟隨在一個leading   byte子節後面的字節被稱作”trail   byte”。在DBCS中,trail   byte可以是任意非0值。像SBCS一樣,DBCS字符串的結束標誌也是一個單字節表示的0。
第三種編碼模式是Unicode。Unicode是一種所有的字符都使用兩個字節編碼的編碼模式。Unicode字符有時也被稱作寬字符,因爲它比單 子節字符寬(使用了更多的存儲空間)。注意,Unicode不能被看作MBCS。MBCS的獨特之處在於它的字符使用不同長度的字節編碼。Unicode 字符串使用兩個字節表示的0作爲它的結束標誌。
單字節字符包含拉丁文字母表,accented   characters及ASCII標準和DOS操作系統定義的圖形字符。雙字節字符被用來表示東亞及中東的語言。Unicode被用在COM及Windows   NT操作系統內部。
你一定已經很熟悉單字節字符。當你使用char時,你處理的是單字節字符。雙字節字符也用char類型來進行操作(這是我們將會看到的關於雙子節字符 的很多奇怪的地方之一)。Unicode字符用wchar_t來表示。Unicode字符和字符串常量用前綴L來表示。

 

Unicode   :寬字節字符集  
  1. 如何取得一個既包含單字節字符又包含雙字節字符的字符串的字符個數?  
  可以調用Microsoft   Visual   C++的運行期庫包含函數_mbslen來操作多字節(既包括單字節也包括雙字節)字符串。  
  調用strlen函數,無法真正瞭解字符串中究竟有多少字符,它只能告訴你到達結尾的0之前有多少個字節。  
  2. 如何對DBCS(雙字節字符集)字符串進行操作?  
  函數 描述  
  PTSTR   CharNext   (   LPCTSTR   ); 返回字符串中下一個字符的地址  
  PTSTR   CharPrev   (   LPCTSTR,   LPCTSTR   ); 返回字符串中上一個字符的地址  
  BOOL   IsDBCSLeadByte(   BYTE   ); 如果該字節是DBCS字符的第一個字節,則返回非0值  
  3. 爲什麼要使用Unicode?  
  (1) 可以很容易地在不同語言之間進行數據交換。  
  (2) 使你能夠分配支持所有語言的單個二進制.exe文件或DLL文件。  
  (3) 提高應用程序的運行效率。  
  Windows   2000是使用Unicode從頭進行開發的,如果調用任何一個Windows函數並給它傳遞一個ANSI字符串,那麼系統首先要將字符串轉換成Unicode,然後將Unicode字符串傳遞給操作系統。如果希望函數返回ANSI字符串,系統就會首先將Unicode字符串轉換成ANSI字符串,然後將結果返回給你的應用程序。進行這些字符串的轉換需要佔用系統的時間和內存。通過從頭開始用Unicode來開發應用程序,就能夠使你的應用程序更加有效地運行。  
  Windows   CE   本身就是使用Unicode的一種操作系統,完全不支持ANSI   Windows函數  
  Windows   98   只支持ANSI,只能爲ANSI開發應用程序。  
  Microsoft公司將COM從16位Windows轉換成Win32時,公司決定需要字符串的所有COM接口方法都只能接受Unicode字符串。  
  4. 如何編寫Unicode源代碼?  
  Microsoft公司爲Unicode設計了WindowsAPI,這樣,可以儘量減少代碼的影響。實際上,可以編寫單個源代碼文件,以便使用或者不使用Unicode來對它進行編譯。只需要定義兩個宏(UNICODE和_UNICODE),就可以修改然後重新編譯該源文件。  
  _UNICODE宏用於C運行期頭文件,而UNICODE宏則用於Windows頭文件。當編譯源代碼模塊時,通常必須同時定義這兩個宏。  
  5. Windows定義的Unicode數據類型有哪些?  
  數據類型 說明  
  WCHAR Unicode字符  
  PWSTR 指向Unicode字符串的指針  
  PCWSTR 指向一個恆定的Unicode字符串的指針  
  對應的ANSI數據類型爲CHAR,LPSTR和LPCSTR。  
  ANSI/Unicode通用數據類型爲TCHAR,PTSTR,LPCTSTR。  
  6. 如何對Unicode進行操作?  
  字符集 特性 實例  
  ANSI 操作函數以str開頭 strcpy  
  Unicode 操作函數以wcs開頭 wcscpy  
  MBCS 操作函數以_mbs開頭 _mbscpy  
  ANSI/Unicode 操作函數以_tcs開頭 _tcscpy(C運行期庫)  
  ANSI/Unicode 操作函數以lstr開頭 lstrcpy(Windows函數)  
  所有新的和未過時的函數在Windows2000中都同時擁有ANSI和Unicode兩個版本。ANSI版本函數結尾以A表示;Unicode版本函數結尾以W表示。Windows會如下定義:  
  #ifdef     UNICODE  
  #define     CreateWindowEx     CreateWindowExW  
  #else  
  #define     CreateWindowEx     CreateWindowExA  
  #endif       //   !UNICODE  
  7. 如何表示Unicode字符串常量?  
  字符集 實例  
  ANSI “string”  
  Unicode L“string”  
  ANSI/Unicode T(“string”)或_TEXT(“string”)if(   szError[0]   ==   _TEXT(‘J’)   ){   }  
  8. 爲什麼應當儘量使用操作系統函數?  
  這將有助於稍稍提高應用程序的運行性能,因爲操作系統字符串函數常常被大型應用程序比如操作系統的外殼進程Explorer.exe所使用。由於這些函數使用得很多,因此,在應用程序運行時,它們可能已經被裝入RAM。  
  如:StrCat,StrChr,StrCmp和StrCpy等。  
  9. 如何編寫符合ANSI和Unicode的應用程序?  
  (1) 將文本串視爲字符數組,而不是chars數組或字節數組。  
  (2) 將通用數據類型(如TCHAR和PTSTR)用於文本字符和字符串。  
  (3) 將顯式數據類型(如BYTE和PBYTE)用於字節、字節指針和數據緩存。  
  (4) 將TEXT宏用於原義字符和字符串。  
  (5) 執行全局性替換(例如用PTSTR替換PSTR)。  
  (6) 修改字符串運算問題。例如函數通常希望在字符中傳遞一個緩存的大小,而不是字節。這意味着不應該傳遞sizeof(szBuffer),而應該傳遞(sizeof(szBuffer)/sizeof(TCHAR)。另外,如果需要爲字符串分配一個內存塊,並且擁有該字符串中的字符數目,那麼請記住要按字節來分配內存。這就是說,應該調用malloc(nCharacters   *sizeof(TCHAR)),而不是調用malloc(nCharacters)。  
  10. 如何對字符串進行有選擇的比較?  
  通過調用CompareString來實現。  
  標誌 含義  
  NORM_IGNORECASE 忽略字母的大小寫  
  NORM_IGNOREKANATYPE 不區分平假名與片假名字符  
  NORM_IGNORENONSPACE 忽略無間隔字符  
  NORM_IGNORESYMBOLS 忽略符號  
  NORM_IGNOREWIDTH 不區分單字節字符與作爲雙字節字符的同一個字符  
  SORT_STRINGSORT 將標點符號作爲普通符號來處理  
  11. 如何判斷一個文本文件是ANSI還是Unicode?  
  判斷如果文本文件的開頭兩個字節是0xFF和0xFE,那麼就是Unicode,否則是ANSI。  
  12. 如何判斷一段字符串是ANSI還是Unicode?  
  用IsTextUnicode進行判斷。IsTextUnicode使用一系列統計方法和定性方法,以便猜測緩存的內容。由於這不是一種確切的科學方法,因此   IsTextUnicode有可能返回不正確的結果。  
  13. 如何在Unicode與ANSI之間轉換字符串?  
  Windows函數MultiByteToWideChar用於將多字節字符串轉換成寬字符串;函數WideCharToMultiByte將寬字符串轉換成等價的多字節字符串。   
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章