首先 簡單說一下曆史,ascii碼最開始是美國人搞出來的,用來幹什麼呢?我們知道,電腦只知道0和1,如果我們要電腦識別除了01之外的字元,例如 'a',我們要先告訴電腦‘1100001’就是'a'。跟摩斯密碼一樣,敲幾下三長兩短就是代表sos(開玩笑)。所謂的字元編碼,就是跟電腦打交 道,跟電腦約定一連串的0101到底代表了什麼字元。
ascii編碼是鼻祖了,不過由於ascii只有8bits,而且實際上用到的是7位,所以能表示的只有128個字元(00000000~01111111)。這128個字元包括了可列印的一般字元,也包括了不可列印的命令字元。看下錶。這128個字元,對於美國人來說,應該是足夠了。但對於一些使用非英文字元的國家地區,例如拉丁文,發文,俄文,中文,這就絕對不夠。所以後來就有人搞了擴充的ascii,也有人搞了新的字元編碼,在原來的8位基礎上擴充到16位,32位。我們常見的ISOxxxx,GB2312,GBK,BIG 5,unicode....都是後來發展起來的。雖然這
些字元編碼有些之間是不相容,例如就中文而言,gb2312是不相容unicode的,就是說,同一個漢字,底層約定的二進位是不一樣的。網頁上的亂碼就
是出於此。但是這些後來發展的字元編碼都向下相容了ascii。這就是為什麼utf-8(unicode)和gbk/gb2312顯示英文是不會有亂碼,
而顯示中文會容易亂碼。因為他們都相容ascii,所以52個字母的顯示都是按ascii標準。但ascii是沒中文的,所以unicode,gbk都按
各自標準解釋了。從簡單入手,我們先來看ascii標準的編碼。弄清楚PHP裡面的二進位,十進位,八進位,十六進位,字元的表示與轉化。先來說一下一些標記法:Dec:十進位Hex:十六進位Oct:八進位Bin:二進位所以數字16表示為:16D = 01H = 018O = 1000 0000B上面這些都是一些標記法而已。方便給人看的。=================================================================================================現在有一個需求,在程式中輸入一個十六進位數,讓電腦顯示對應的ascii字元。例如就41H就對應A。方法一:用逸出字元:逸出字元裡提供\xdd和\ddd,\xdd表示十六進位,\ddd表示八進位所以我們可以:
[php] view plaincopy
- <?php
- echo "\x41"; //十六進位,\x開頭
- echo "\101"; //八進位,隨便幾位
- ?>
注意:逸出字元只提供了十六進位和八進位轉換到字元,沒有提供二進位、十進位轉換到字元。所以要用另外一種方法。方法二:用php裡面的chr()函數。這個函數參數很簡單,就是ascii碼對應的十進位,十六進位,八進位。十進位:直接寫整數八進位:第一位肯定是0,後面隨便幾位十六進位:0xdd二進位:字串注意:一定要記清楚十六進位是0xdd
[php] view plaincopy
- <?php
- echo chr(65); //十進位,由雩都輸數,所以沒必要加雙引號了
- echo chr(0x41); //十六進位
- echo chr(0101); //八進位,三位,最高位補零
- echo chr('01000001'); //二進位,注意,這裡的二進位一定要看做字串,加引號!上面三個都不用加
- ?>
方法三用php裡面的printf/sprintf()函數格式化輸出
[php] view plaincopy
- <?php
- printf("%c", 0x41); //第二個參數一定不能用單/雙引號
- printf("%c", 0101); //第二個參數一定不能用單/雙引號
- printf("%c", 65); //第二個參數一定不能用單/雙引號
- printf("%c", '01000001');
- ?>
第二個參數格式基本跟chr()的一樣,8進位,10進位,16進位都不加引號,二進位就要加引號。8進位首位為0,16進位首位為0x。
====================================================================================現在是根據一個字元提取ascii表中的對應值方法一:ord()函數
[php] view plaincopy
- <?php
- echo ord('A');
- ?>
輸出結果是65。因而這個函數只能從字元轉化到十進位。注意:這個方法只提取第一個字元。如果是一個字串,那就沒辦法處理後面的字元了。方法二:bin2hex()函數:將字元[串]轉換為16進位
[php] view plaincopy
- <?php
- echo bin2hex('A');
- ?>
輸出結果是41。注意,這個41隻是字面數值,沒有16進位的意義。這個函數不能用一個二進位‘01101...’直接轉到16進位,只能由字串轉到16進位,真怪這個函數可以處理字串 printf/sprintf()函數.....發現都不行所以,只能先用ord()轉化為十進位,再轉為二進位,八進位。(以後再看看pack這個函數)====================================================================================各種進位 的轉換:bindec():二進位轉十進位
[php] view plaincopy
- <?php
- echo bindec(1100); //輸出12,可以加引號,也可以不加
- ?>
decbin():十進位轉二進位,一樣用
dechex() :十進位轉16進位hexdec():16進位轉10進位(參數直接寫值,不用寫0x)
octdec():八進位轉10進位decoct():10進位轉8進位
base_convert(要轉換的數,原進位,目標進位):任意進位轉換<?phpecho base_convert(123, 6, 2);?>注意:上面的這些轉換函式,由雩都是數學處理函數,所以參數都不需要是字串形式(不需要加引號),直接寫數值就行了。