字元編碼及檔案讀取的基礎知識

2021-06-22 19:58:40 字數 3260 閱讀 9575

這是以前寫的一點筆記,把它轉過來。

1、二進位制檔案和文字檔案

首先看二段**:生成乙個二進位制檔案和乙個文字檔案。開啟乙個二進位制檔案:test.dat,

寫入整數

1234

,其對應的十六進製制為

04 d2。

file *pfile;

int ntest = 1234;

if(null == (pfile=fopen("

test.dat

","wb

")))

fwrite(&ntest,sizeof(int),1,pfile);

fclose(pfile);

用ultraedit

開啟,可以看見:

然後:再次寫乙個檔案:

file *pfile;

int ntest = 1234;

if(null == (pfile=fopen("

test.bin

","w

")))

//fwrite(&ntest,sizeof(int),1,pfile);

fputs("

1234

", pfile);

fclose(pfile);

開啟後顯示:

世界上本沒有文字檔案,只說用的人多了才有了文字檔案的概念。所有儲存在計算機上的檔案都是以二進位制位元流的形式存在。有些位元流的特定多少位表示乙個能可見的字元(比如說o1100101表示a

),那麼組成的檔案就是通常所說的文字檔案,除此之外的就是二進位制檔案了,二進位制檔案通常開啟都是亂碼,是因為你的工具(如記事本等)往往按照乙個位元組乙個位元組去讀取二進位制位元流,而有時候這個位元組代表了乙個不可見的字元,比如上面的

d2。我們平時用的

doc,

bmp等檔案都是二進位制檔案。

2、二進位制檔案和文字檔案的開啟方式

文字方式和二進位制方式僅僅是一種方式,不是說文字方式用來開啟文字檔案,二進位制方式開啟二進位制檔案。這兩種方式的惟一區別就是:當利用文字方式開啟檔案時,遇到回車換行就轉換成』\n』(windows

需要轉換,而

linux

系統不需要,這是因為

windows

與linux

表示換行的識別符號不一樣,前者是

\r\n,

而後者是

\n,與

c語言規定的是一樣的,在

linux

下面這兩種方式沒有區別。而且轉化的工作由編譯器完成,作業系統只負責處理資料流),而二進位制方式沒有這種轉換。文字檔案裡的每個位元組資料

(當然也是用二進位制儲存在計算機上

)一般都表示乙個

ascii

(這裡暫時只說

ansi

文字格式,對於

unicode

則不同了,後面會講到),而二進位制檔案裡的每個位元組資料可能表示乙個

ascii

也可能不是,當在

ascii

表中可以找到對應的字元時,你用文字編輯器開啟時就能看見對應的字元,如果找不到就是亂碼。

fread和

fwrite

往往用於讀取和寫入二進位制檔案,當然也可以讀取和寫入文字檔案;反之,

fgets

和fputs

往往用於文字檔案的讀取和寫入,當然也可以讀取和寫入二進位制檔案。一切取決於你寫入的資料格式和對讀取的內容做什麼樣的解析。計算機只負責和二進位制資料打交道,它不管你的二進位制資料表示什麼。

file *pfile;

char buf[1024] = ;

int ncount;

if(null == (pfile=fopen("

test.txt

","r

")))

//if(null == (pfile=fopen("test.txt","rb")))

//fread(&ntest,sizeof(int),1,pfile);

fgets(buf, 1024, pfile);

//printf("%d\n",ntest);

for (int na=0; na<1024 && buf[na]!=0; na++)

fclose(pfile);

用文字方式開啟結果:

用二進位制方式開啟:

3,ansi/gbk/unicode/utf-8

ansi:

最初是美國制定的一套標準,也就是

ansi

的ascii,

用0-127

表示乙個字元。

gbk:中國為了支援漢字,用兩個位元組表示乙個漢字。在判斷這個位元組大於

127,說明是乙個漢字編碼的開始,然後讀取下乙個位元組,組合在一起形成乙個漢字。

gbk裡面小於

127的位元組表示的含義與

ascii

一樣。

unicode:為了統一世界上各個國家的字元編碼集,制定了乙個統一的編碼方案,概括了所有的語言字元,用2

個位元組表示。

utf-8:

實際上是

unicode

的一種實現形式。因為

unicode

只是規定了字元的編碼內容,沒有規定字元的儲存方式。網路上的資料流往往以位元組流的形式傳送或者接收,

utf-8

規定了這些位元組流的儲存方式。

規定了這些位元組流的儲存方式。

utf-8

0000 - 007f                  0******x

0080 - 07ff                  110***xx 10******

0800 – ffff                 1110***x 10****** 10******

英文符號用1

個位元組表示,漢字一般用

3個位元組表示。實際上的對於英文,

utf-8

比ascii

節省空間,而漢字則相反。

接下來出現了乙個問題,當解析乙個文字時,如何得知其編碼方式,這裡就是由各種檔案的頭標誌決定的:

低位位址---->高位位址

ef bb bf                  utf-8

fe ff                      utf-16/ucs-2, big endian

ff fe                       utf-16/ucs-2, little endian(小高高)

ff fe  00 00            utf-32/ucs-4, little endian.

基礎知識總結 字元編碼

因為資料是二進位制表示的,現在存在各種各樣的編碼,因為計算機識別的編碼與資料本身的編碼不一致,就會造成亂碼。ascii 美國規定的128個字元表示的二進位制表示方法,這種方法稱為ascii碼,計算機儲存的最小單位是位元組 8位 ascii碼的後7位表示字元本身,最高位設定為0,後7位0 127表示1...

Python基礎知識之字元編碼與轉碼

python直譯器在載入.py檔案中的 時,會對內容進行編碼 預設ascii ascii american standard code for information interchange,美國標準資訊交換 是基於拉丁字母的一套電腦編碼系統,主要用於顯示現代英語和其他西歐語言,其最多只能用8位來表...

編碼相關1 基礎知識

一 編碼基本知識 1 字符集 字元編碼是什麼 字符集是乙個系統支援的所有抽象字元的集合 字元編碼 不同的字元編碼其實是不同的法則,該法則可以使某種自然語言,與其他訊號 資訊 號碼 電脈衝 相配對 即在自然語言符號與數字系統之間建立特定聯絡。簡而言之,各種符號通過字元編碼轉化為可以被計算機識別的數字。...