這是以前寫的一點筆記,把它轉過來。
1、二進位制檔案和文字檔案
首先看二段**:生成乙個二進位制檔案和乙個文字檔案。開啟乙個二進位制檔案:test.dat,
寫入整數
1234
,其對應的十六進製制為
04 d2。
file *pfile;用ultraeditint ntest = 1234;
if(null == (pfile=fopen("
test.dat
","wb
")))
fwrite(&ntest,sizeof(int),1,pfile);
fclose(pfile);
開啟,可以看見:
然後:再次寫乙個檔案:
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 字符集 字元編碼是什麼 字符集是乙個系統支援的所有抽象字元的集合 字元編碼 不同的字元編碼其實是不同的法則,該法則可以使某種自然語言,與其他訊號 資訊 號碼 電脈衝 相配對 即在自然語言符號與數字系統之間建立特定聯絡。簡而言之,各種符號通過字元編碼轉化為可以被計算機識別的數字。...