Virsual Studio 字元編碼和編碼方式

2021-06-20 05:31:52 字數 2866 閱讀 9537

編碼我們大致可以分為兩類:檔案編碼和記憶體編碼。檔案編碼(用untraedit可以看到裡面的編碼)即源**檔案的編碼,gbk,utf-8等。記憶體編碼即源**編譯成為二進位制檔案的時候採用的編碼。在此我要說的是記憶體編碼;記憶體編碼在vc中只有3個選項:not set,use multi-byte character set和use unicode character set。

1)multi-byte character set(mbcs

):多位元組字符集,字元的大小是可變的;乙個mbcs編碼包含一些乙個位元組長的字元,而另一些字元大於乙個位元組的長度。

2)unicode:一種所有的字元都使用兩個位元組編碼的編碼模式。

. unicode

後來,有人開始覺得太多編碼導致世界變得過於複雜了,讓人腦袋疼,於是大家坐在一起拍腦袋想出來乙個方法:所有語言的字元都用同一種字符集來表示,這就是unicode。

最初的unicode標準ucs-2使用兩個位元組表示乙個字元,所以你常常可以聽到unicode使用兩個位元組表示乙個字元的說法。但過了不久有人覺得256*256太少了,還是不夠用,於是出現了ucs-4標準,它使用4個位元組表示乙個字元,不過我們用的最多的仍然是ucs-2。

ucs(unicode character set)還僅僅是字元對應碼位的一張表而已,比如"漢"這個字的碼位是6c49。字元具體如何傳輸和儲存則是由utf(ucs transformation format)來負責。

一開始這事很簡單,直接使用ucs的碼位來儲存,這就是utf-16,比如,"漢"直接使用\x6c\x49儲存(utf-16-be),或是倒過來使用\x49\x6c儲存(utf-16-le)。但用著用著美國人覺得自己吃了大虧,以前英文本母只需要乙個位元組就能儲存了,現在大鍋飯一吃變成了兩個位元組,空間消耗大了一倍……於是utf-8橫空出世。

utf-8是一種很彆扭的編碼,具體表現在他是變長的,並且相容ascii,ascii字元使用1位元組表示。然而這裡省了的必定是從別的地方摳出來的,你肯定也聽說過utf-8裡中文字元使用3個位元組來儲存吧?4個位元組儲存的字元更是在淚奔……(具體ucs-2是怎麼變成utf-8的請自行搜尋)

另外值得一提的是bom(byte order mark)。我們在儲存檔案時,檔案使用的編碼並沒有儲存,開啟時則需要我們記住原先儲存時使用的編碼並使用這個編碼開啟,這樣一來就產生了許多麻煩。(你可能想說記事本開啟檔案時並沒有讓選編碼?不妨先開啟記事本再使用檔案 -> 開啟看看)而utf則引入了bom來表示自身編碼,如果一開始讀入的幾個位元組是其中之一,則代表接下來要讀取的文字使用的編碼是相應的編碼:

bom_utf8 '\xef\xbb\xbf'

bom_utf16_le '\xff\xfe'

bom_utf16_be '\xfe\xff'

並不是所有的編輯器都會寫入bom,但即使沒有bom,unicode還是可以讀取的,只是像mbcs的編碼一樣,需要另行指定具體的編碼,否則解碼將會失敗。

你可能聽說過utf-8不需要bom,這種說法是不對的,只是絕大多數編輯器在沒有bom時都是以utf-8作為預設編碼讀取。即使是儲存時預設使用ansi(mbcs)的記事本,在讀取檔案時也是先使用utf-8測試編碼,如果可以成功解碼,則使用utf-8解碼。記事本這個彆扭的做法造成了乙個 bug:如果你新建文字檔案並輸入"奼塧"然後使用ansi(mbcs)儲存,再開啟就會變成"漢a",你不妨試試 :)  

字元基礎   --   ascii,   dbcs,   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編碼中(乙個常用的日文編碼模式),0x81-0x9f之間和   0xe0-oxfc之間的值表示 "這是乙個雙位元組字元,下乙個子節是這個字元的一部分。 "這樣的值被稱作 "leading   bytes ",他們都大於0x7f。跟隨在乙個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來表示。 

Virsual Studio 開發問題

win32 控制台應用 自動生成 stdafx.h stdatx.cpp resouce.h targetver.h 工程名.cpp win32 dll 自動生成 stdafx.h stdatx.cpp resouce.h targetver.h 工程名.cpp dllmain.cpp stdafx...

字元,字元陣列,字元指標

一 字串變數與常量 例 char a abcdefg 這一段語句中,既有字串變數,也有字串常量。變數是陣列a,常量是 中的字面量字串 abcdefg 此時,可以訪問或修改a中任意乙個元素 但是,常量字串只能訪問,不能修改。這句留著下面有用 二 字元指標與字串常量 例 char p abcdefg 這...

字元 字符集 字元編碼

字元是指計算機 中使用的字母 數字 字和符號 包括 1 2 3 a b c 等等。在 ascii 編碼中,乙個英文本母字元儲存需要1個位元組。在 gb 2312 編碼或 gbk 編碼中,乙個漢字 字元儲存需要2個位元組 在utf 8編碼中,乙個英文本母字元儲存需要1個位元組,乙個漢字字元儲存需要3到...