php與ascii碼

來源:互聯網
上載者:User

首先 簡單說一下曆史,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
  1. <?php  
  2. echo "\x41";                    //十六進位,\x開頭  
  3. echo "\101";                    //八進位,隨便幾位  
  4. ?>  

 

注意:逸出字元只提供了十六進位和八進位轉換到字元,沒有提供二進位、十進位轉換到字元。所以要用另外一種方法。方法二:用php裡面的chr()函數。這個函數參數很簡單,就是ascii碼對應的十進位,十六進位,八進位。十進位:直接寫整數八進位:第一位肯定是0,後面隨便幾位十六進位:0xdd二進位:字串注意:一定要記清楚十六進位是0xdd [php] view plaincopy
  1. <?php  
  2. echo chr(65);                    //十進位,由雩都輸數,所以沒必要加雙引號了  
  3. echo chr(0x41);                 //十六進位  
  4. echo chr(0101);                 //八進位,三位,最高位補零  
  5. echo chr('01000001');         //二進位,注意,這裡的二進位一定要看做字串,加引號!上面三個都不用加  
  6. ?>  

 

方法三用php裡面的printf/sprintf()函數格式化輸出 [php] view plaincopy
  1. <?php  
  2. printf("%c", 0x41);               //第二個參數一定不能用單/雙引號  
  3. printf("%c", 0101);               //第二個參數一定不能用單/雙引號  
  4. printf("%c", 65);                    //第二個參數一定不能用單/雙引號  
  5. printf("%c", '01000001');  
  6. ?>  

 

第二個參數格式基本跟chr()的一樣,8進位,10進位,16進位都不加引號,二進位就要加引號。8進位首位為0,16進位首位為0x。
====================================================================================現在是根據一個字元提取ascii表中的對應值方法一:ord()函數 [php] view plaincopy
  1. <?php  
  2. echo ord('A');  
  3. ?>  

 

輸出結果是65。因而這個函數只能從字元轉化到十進位。注意:這個方法只提取第一個字元。如果是一個字串,那就沒辦法處理後面的字元了。方法二:bin2hex()函數:將字元[串]轉換為16進位 [php] view plaincopy
  1. <?php  
  2. echo bin2hex('A');  
  3. ?>  

 

輸出結果是41。注意,這個41隻是字面數值,沒有16進位的意義。這個函數不能用一個二進位‘01101...’直接轉到16進位,只能由字串轉到16進位,真怪這個函數可以處理字串  printf/sprintf()函數.....發現都不行所以,只能先用ord()轉化為十進位,再轉為二進位,八進位。(以後再看看pack這個函數)====================================================================================各種進位 的轉換:bindec():二進位轉十進位 [php] view plaincopy
  1. <?php  
  2. echo bindec(1100);           //輸出12,可以加引號,也可以不加                 
  3. ?>   

 

decbin():十進位轉二進位,一樣用
dechex() :十進位轉16進位hexdec():16進位轉10進位(參數直接寫值,不用寫0x)
octdec():八進位轉10進位decoct():10進位轉8進位
base_convert(要轉換的數,原進位,目標進位):任意進位轉換<?phpecho base_convert(123, 6, 2);?>注意:上面的這些轉換函式,由雩都是數學處理函數,所以參數都不需要是字串形式(不需要加引號),直接寫數值就行了。
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.