C 教學第19講字元1 學習筆記

2021-05-08 20:51:34 字數 3289 閱讀 9086

第19講字元1

快樂喬巴的部落格

現在我們來講講電腦螢幕上的文字,螢幕上的字是由乙個個畫素點組成的。每乙個字元用乙個畫素點拼接出來,這些畫素點組成影象變成了我們的文字,我們可以用windows自帶的放大鏡來看(在左下角的開始--程式--附件--輔助工具中找到),然後放大倍數可以看到文字是由畫素點組成的,如圖:

可以看出這些文字都是由乙個個畫素點組成的,這說明文字其實是乙個影象,計算機又是如何將我們的文字儲存起來呢?是用乙個個點將文字儲存起來嗎?當然不是,讓我們先從英文開始,由於英文是拼寫字元,英文本母a-z也就是26個字母再加上其他的符號一共也不會超過100個,這也就是說在我們的文字中存在著大量的重複符號。如果我們以影象的方式來儲存字元,這樣就會占用大量的磁碟空間,所以呢在計算機中實際上不會儲存字元的影象。

那如何解決字元的儲存問題呢?這就不得不提到字元編碼。由於我們的文字中存在著大量的重複字元,而計算機天生就是用來處理數字的,為了減少我們需要儲存的資訊量,我們可以使用乙個數字編碼來表示每乙個字元,通過對每乙個字元規定乙個唯一的數字代號,然後,對應每乙個代號,建立其相對應的圖形,這樣,在每乙個檔案中,我們只需要儲存每乙個字元的編碼就相當於儲存了文字,在需要顯示出來的時候,先取得儲存起來的編碼,然後通過編碼表,我們可以查到字元對應的圖形,然後將這個圖形顯示出來,這樣我們就可以看到文字了,這些用來規定每乙個字元所使用的****,就稱為編碼表。編碼表就是對我們日常使用字元的一種數字編號。

下面我們來說一下第乙個編碼表ascii(美國標準資訊交換碼),在最初的時候,美國人自定了第一張編碼表《美國標準資訊交換碼》,簡稱ascii。它總共規定了128個符號所對應的數字代號,使用了7位二進位制來表示這些數字,其中包含了英文的大小寫字母,數字,標點符號等常用的字元,數字代號從0-127,ascii的內容如下:

我們首先介紹一下字元在c#中的常用方法:

字元和整數之間可以進行自由的轉換,如下:

這時候可能有人要問了,能不能65轉換成字母a呢?這個沒問題,**如下:

當然,也可以用強制型別轉換把41強制轉換為a,**如下:

好,學習了這些方法我們就可以嘗試列印出ascii字元表,**如下:

我們執行程式,效果如圖:

好,這個ascii表就列印出來了,但是這裡有一些怪異的現象,比如說8後面的冒號沒有了,這是因為8這個ascii代表的是回退鍵,還有11到13都沒有列印出來,10是乙個換行符,所以就新起了一行,而13是回車符,11,12大家可以自己去翻一些資料。我們可以和之前的ascii表對比一下,是完全對應的。

由於ascii出現的最早,因此各種編碼實際上都受到了它的影響,並盡量與其相容。比如我們剛才所寫的列印ascii碼的這個程式,其實列印的是unicode編碼,但是unicode編碼完全與ascii碼相容。所以列印出來的跟ascii碼其實是一樣的。

下面我們來講一下擴充套件的ascii編碼-iso8859,美國人通過ascii碼順利解決了字元問題,可是歐洲各個國家還沒有。比如法語中經常有許多英語中沒有的字元因此呢ascii碼並不能幫助歐洲人解決編碼問題。這個時候就出現了iso-8859,由於ascii碼使用了7個位來儲存乙個編碼,也就是說他有乙個位其實是空著的,iso-8859就使用了這個空的位,一共是8個位來儲存乙個編碼,這樣2的8次方等於256,也就是它所能儲存的字元是ascii的2倍。iso-8859編碼表如下:

由於這一張編碼表中,只能增加95種字元的**,這還滿足不了整個歐洲的需要,所以呢iso8859實際上不是一張編碼表而是一系列的標準。它包括了14個字元碼表,例如西歐的常用字元就包含在iso8859-1字元表中,而在iso8859-7中則包含了ascii跟現代希臘語字元。這就是說iso8859一共有14種表現形式。

這時候iso8859標準看上去像是解決了西歐人的字元問題,但是也帶來了新的問題,比如說不能在同一篇文章中同時使用希臘文跟法文,因為他們的編碼範圍是重合的,他們分別使用的是iso8859-1和iso8859-7這2種字元表。當然這個問題還不是很嚴重,更為嚴重的問題是中國,朝鮮,日本,南韓的文字中包含了大量的符號,比如說我們中國的文字不是拼音文字,漢字有數萬個之多,遠遠超過了256個字元。因此iso8859實際上不能處理中文的字元,這個問題只能靠我們中國人自己來解決,下面我們就來講一下中文編碼。

既然乙個位元組256種字元不能表示中文,那麼我們就可以使用2個位元組來表示乙個中文。我們可以計算一下2個位元組可以存放多少種字元,2個位元組是16位,就是2的16次方65536。

第乙個中文編碼表gb2312-80,這個標準是2023年制定的,它共收入了6768個漢字,這些漢字對於我們日常使用來說已經足夠了。但是,隨著時間的推移和漢字文化的不斷延伸及推廣,有些原來很少用的字現在變成了常用字。比如說我們經常可以碰到一些名字非常怪異的人,他的名字在電腦中是打不出來的,所以到後來gb2312已經不能滿足我們日常的使用,為了解決這些問題,我國於2023年12月1日發布了gbk編碼規範。gbk與gb2312完全相容,它收錄了21003個漢字,基本上囊括了我國的所有漢字。gb18030是最新的漢字編碼字符集國家標準,它向下相容gbk和gb2312,gb18030編碼是一種可變字長的編嗎,它可以以乙個位元組或者2個位元組或者4個位元組的方式來進行儲存,也就是說它的長度是可變的。

好,現在的中文問題是可以解決了。但是新的問題就來了,隨著網際網路的發展,我們可以直接訪問遠在天邊的伺服器,電子檔案在全世界傳播,而每個國家都使用自己的編碼表,這時候就出現了亂碼的問題。如果整個地球都使用一張統一的編碼表,這樣就不會出現亂碼了。就好像我們全世界的人都說一種語言,那該多方便。

unicode是乙個組織自律於制定乙個能夠覆蓋幾乎任何語言的編碼表,它的全稱是universal multiple-octet coded character set(全球雙位元組編碼字符集),簡稱為ucs。我們現在使用的.net framework2.0它使用的就是unicode字符集,這樣就簡化了全球運用程式的開發。unicode字符集它統一使用2個位元組來儲存乙個編碼,當然它也有很多種形式,大家可以查閱相關的資料。

unicode的出現看上去是徹底解決了字元問題,但是現在還在使用中的大量的軟體和硬體有很多基於單位元組的編碼實現的,這時候ucs也就是unicode的雙位元組表示的字元是不可能在其上面工作的。這樣就出現了utf編碼。為了盡可能與現有的軟體和硬體相適應,美國人又制定了一系列用於傳輸和儲存unicode編碼的標準utf,這些編碼稱為ucs傳輸格式碼,也就是將ucs的編碼通過一定的轉換,來達到使用它的目的。常見的有utf-7 utf-8 utf-16等,其中utf-8得到了廣泛的使用。

utf-8編碼是可變長的編碼,對於不同的unicode它可以變成不同的長度,utf-8的出現解決了字元編碼問題,又可以在現有的裝置上通行,因此得到了廣泛的應用。比如現在網路上非常流行的xml技術,它使用的就是utf-8標準編碼。說了這麼多其實我只是講了計算機編碼技術的一小點,也就是大概做個介紹。如果大家感興趣可以查閱相關的資料。

好,這節課就講到這裡。

由快樂喬巴聽課摘寫筆記

C 教學第9講事件1 學習筆記

第9講 事件1 快樂喬巴的部落格 事件是類在發生其關注的事情時來提供通知的一種方式。例如,封裝使用者介面控制項的類可以定義乙個在使用者單擊該控制項時發生的事件。控制項類不關心單擊按鈕時發生了什麼,但它需要告知派生類單擊事件已發生。然後,派生類可選擇如何響應。說到事件,就得談談2個角色 事件發行者 p...

C 教學第20講字元2 學習筆記

第20講字元2 快樂喬巴的部落格 在上一節課中我們已經講過,在.net framework中字元總是表示成16位的unicode 值,這樣就簡化了我們的開發。在以前的開發中,有些程式語言它英文所占用的是乙個位元組,而中文是2個位元組,在c 中不管是英文還是中文它統一都是占用2個位元組,這樣就使得我們...

C 教學第15講索引器1 學習筆記

第15講索引器1 快樂喬巴的部落格 索引器允許類或結構的例項按照與陣列相同的方式進行索引。索引器類似於屬性,不同之處在於它們的訪問器採用引數。索引器也被稱為有參屬性,下面我們來看看索引器跟陣列和屬性之間有什麼不同。我們新建乙個空白檔案,首先先看看類陣列是怎麼使用的 通過執行,我們可以得到結果,各自人...