2013年12月2日 星期一

ASCII字元與編碼&數字系統

字元集與編碼
character set 是字元集(字符集); encoding 是編碼
對於 BIG5 (或其他專為單一語言設計的簡單碼) 來說,這兩者可說是同一回事; 但對於 unicode 來說,就很明顯地可以看出這是兩回事。 unicode 是字元集 character set;而 utf8 是它的眾多編碼 encoding 之一,最多人用的那種。不過由於歷史因素,很多文件/軟體選單仍舊將兩者混用。多數時候並不至於造成混淆與困擾。
在電腦內部利用二進制數字表示字符。字符編碼就是利用二進制的數字來對應字符集的字符,此二進制數字便是系統內碼。例如目前用得最普遍的字符集是ANSI,對應ANSI字符集的二進制編碼就稱為ANSI碼,DOS和Windows系統都使用了ANSI碼。
字元集
(符號的集合)
字元編碼,內碼
(顯示符號的方法,編碼順序)
說明
ASCII
ASCII 7bits
BCD(0+4)
BCDIC(2+4)
EBCD(2+4)
EBCDIC(4+4)
可將文字存成7個位元。常見於一般個人電腦,基本以7位元為編碼,可表示2^7=128字元,。ASCII第1至第31為特殊控制碼
以4個位元為一組,表示十進位的值。故共有6種變化未使用
標準BCD碼又稱BCDIC碼。於BCD前方加上2個位元,共有6位元所可以表示的符號共有64個
使用6個位元將字元編碼,所表示的符號共有2^6=64種符號,原是配合IBM公司打字機而開發,便於資訊傳遞
為IBM公司所發展,所表示的符號有26個。IBM與FACOM電腦一般採用此碼,為常用的通訊碼
OEM(ANSI)
ASCII 8bits
ISO8859-1(又名Latin-1)
Windows-1252
(Windows 9X對西歐語言的標準)
Microsoft Code Page 950
各類編碼請參考維基百科.ISO8859
將位元組的第八位元128-255的字碼提供歐洲語言使用的重音字母以及線條繪圖字元。現多數擴充為8位元,亦稱為ASC-8碼,為目前最常用的通訊碼。在ANSI內固定對第8位元的使用方式,依據不同地區而有不同用法。此稱為頁碼code page
在Windows系統下,你可以利用「控制台\地區及語言選項」設定作業系統在使用非unicode語言的方式。如右圖所示
DBCSBIG5,JIS,GB2312,EUC
雙位元組字元集Double Byte Character Set
* GB碼:GB碼是1980年國家公佈的簡體漢字編碼方案,在大陸、新加坡得到廣泛的使用,也稱國標碼。國標碼對6763個漢字集進行了編碼,涵蓋了大多數正在使用的漢字。
* GBK碼:GBK碼是GB碼的擴展字符編碼,對多達2萬多的簡繁漢字進行了編碼,向下與GB碼兼容,簡體版Windows是使用GBK作系統內碼。
*GB 18030:《資訊交換用漢字編碼字元集基本集的擴充》,是中華人民共和國現時最新的內碼字集,與GB2312-80與GBK相容,包含所有GB13000-93及Unicode 3.1字元。
* BIG5碼:BIG5碼是針對繁體漢字的漢字編碼,目前在台灣、香港的電腦系統中得到普遍應用,繁體版Windows是用Big5作系統內碼。
* HZ碼:HZ是GB碼的變體,只用每個字節的首7-bit作編碼(即ANSI的首128個字符),常用於網絡資料傳送。
* JIS: 日文編碼,即ISO-2022-JP,只用每個字節的首7-bit作編碼,常用於網絡資料傳送。
* Shift-JIS: Microsoft制訂的日文編碼標準,適用於Windows日文平台。
* EUC-JP: 常用於日文Unix平台,日文的PHP及MySQL多用這種編碼編寫。
Unicode
統一碼,萬國碼
UTF8,UTF16,UTF32
BASE 64
將字母對應到code point。在Windows系統下可以利用charmap指令把數字找到
Unicode字符集在實際傳輸過程中,由於不同系統平臺的設計不一定一致,以及考量節省空間的目的,各個系統平臺對 Unicode 編碼的呈現方式有所不同。Unicode的呈現方式稱為Unicode轉換格式(Unicode Translation Format,簡稱為 UTF)。目前通用的呈現方式是UTF-16和 UTF-8。此外,Unicode 的呈現方式還包括UTF-7、Punycode、CESU-8、SCSU、UTF-32等
* UTF-8: Unicode 的變體,用 8-bit 編碼,每個字符由一至四個字節組成。
* Unicode 碼:Unicode碼是最新的國際標準編碼,採用二個字節 (16-bit) 編碼,收入了幾乎所有國家的文字符號,適用於所有語言的作業平台,但與ANSI碼不兼容,只應用於支援Unicode的程式。Unicode Little Endian普遍用於x86系統(ie. Intel),而 Unicode Big Endian 普遍用於RISC 系統 (ie. Alpha, Mac)。
The Base64 Content-Transfer-Encoding is designed to represent arbitrary sequences of octets in a form that need not be humanly readable,電子郵件編碼
某些字符集不需經過編碼即可使用,例如BIG5碼

數字資料(整數)
為不含小數點的數字,可用聚集pack、非聚集unpack與一般二進位方式表示
聚集pack十進制
(BCD編碼)
以十進位方式表示,以如下的格式儲存:
DDDDDD...DS
D:表示數字位元,S:表示符號位元(F,C為正,D為負)
非聚集unpack十進制
或稱區域十進制
(BCDIC,ASCII,EBCDIC編碼)
以二進位方式表示,以EBCDIC型式儲存10進位數值於記憶體內,以如下格式儲存:
ZDZDZD...SD
Z:表示區域位元,D:表示數字位元,S:表示符號位元(F,C為正,D為負)
範例
[聚集與非聚集的比較]
PACK(2BYTE)UNPACK
023023FF0F2F3
175175FF1F7F5
-329329DF3F2D9
1357357FF1F3F5F7
數字資料(定點數表示法)
定點數乃是表示小數點固定於某位置的數。應可以分為有號數與無號數,無號數沒有符號位元(可表示範圍:0~2n-1);有號數則以1bit作為符號位元。符號位元以0表示正值,以1表示負值。例如BASIC語言中的整數與長整數。例如:以2byte表示整數,則:
無號數表示法530000000000110101
有號數表示法-53
絕對值1000000000110101
1的補數1111111111001010
2的補數1111111111001011
假設以n位元表示數值,則各型態補數可表示的範圍:
2的補數
sign 2's complement
n個位元要表示正負值,便必須分一半(除2)。所以負值的部分可表示值便是-(2n/2)=-2n-1;正值部分為2n,但因0為正值的開始表示值,所以需扣除0便是2n-1-1
1的補數
sign 1's complement
以n位元表示正負值,除了中間的0外(有+0與-0兩種),其餘正負值部分除符號不同外,為對稱互表補數。正值部分的最大值為2n-1-1,所以負值的最小值為正值加上負號-(2n-1-1)
符號絕對值
sign-magnitude
利用1個位元表示符號,最大值與最小值均與1的補數表示法相同
定點數表示法的運算速度快。





數字系統:



常用的數字系統為10進位,2進位,8進位與16進位
表示法
(4096)10=4*103+0*102+9*101+6*100
(7562)8=7*83+5*82+6*81+2*80
在電腦硬體設計過程或組合語言程式設計,大都採用十六進制表示。
數字系統的轉換
10<-->2,8,16
2<-->8,16
8<-->16
含小數點的實數轉換
非上述數系的轉換
補數
電腦系統中的補數計有1的補數(1's)與2的補數(2's)兩種,如果遇到減法計算,便將減數轉換為補數,再進行加法計算
例如:35 - 57 = 35 + ( -57 ) = 35 + 43 = 78(,無溢位,必須作補數處理)= -22,最後運算結果,轉換為2進位制
補數的轉換方式

數字系統的四則運算
範例1:某計算機有24K記憶體,若第一個位元組之位址為&H0000,則最後一個位元組之位址為?
解法:
  1. 先將24K轉變為2進位表示式
  2. 因為第一位址為0000H,所以將前述轉換的2進位表示式+1,表示程式在記憶體中的最後位址
範例2:一程式在記憶體內的位址範圍由&HAC20到&HBC1F,試問該程式所佔的記憶體空間大小為多少個位元組?
解法:
  1. 以終止位址減去起始位址再加1,便是程式在記憶體中的大小(此為16進制表示法)
  2. 將前述轉換的16進位表示式,轉換為2進位,並由右往左數10個位元表示1K
  3. 計算程式大小
範例3:一程式的大小為10K,在記憶體的起始位址為1234H,則終止位址為?
範例4:某程式目前的程式計數器指向位址&H20000,該程式每段指令碼長度為4,請問執行20個指令後,程式計數器指向的新位址為?(以16進位位址表示)




參考網站:

沒有留言:

張貼留言