php與ascii碼


首先 簡單說一下歷史,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表示八進制
所以我們可以:
  1. <?php  
  2. echo "\x41";                    //十六進制,\x開頭  
  3. echo "\101";                    //八進制,隨便幾位  
  4. ?>  

 

注意:轉義字符只提供了十六進制和八進制轉換到字符,沒有提供二進制、十進制轉換到字符。所以要用另外一種方法。

方法二:
用php里面的 chr()函數。這個函數參數很簡單,就是ascii碼對應的十進制,十六進制,八進制。
十進制:直接寫整數
八進制: 第一位肯定是0,后面隨便幾位
十六進制:0xdd
二進制: 字符串
注意:一定要記清楚十六進制是0xdd
  1. <?php  
  2. echo chr(65);                    //十進制,由於都輸數,所以沒必要加雙引號了  
  3. echo chr(0x41);                 //十六進制  
  4. echo chr(0101);                 //八進制,三位,最高位補零  
  5. echo chr('01000001');         //二進制,注意,這里的二進制一定要看做字符串,加引號!上面三個都不用加  
  6. ?>  

 


方法三
用php里面的 printf/sprintf()函數格式化輸出
  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()函數
  1. <?php  
  2. echo ord('A');  
  3. ?>  

 

輸出結果是65。因而這個函數只能從字符轉化到 十進制。
注意:這個方法只提取第一個字符。如果是一個字符串,那就沒辦法處理后面的字符了。

方法二:
bin2hex()函數:將字符[串]轉換為 16進制
  1. <?php  
  2. echo bin2hex('A');  
  3. ?>  

 

輸出結果是41。
注意,這個41只是字面數值,沒有16進制的意義。
這個函數不能用一個二進制‘01101...’直接轉到16進制,只能由字符串轉到16進制,真怪
這個函數可以處理字符串  

printf/sprintf()函數
.....發現都不行
所以,只能先用ord()轉化為十進制,再轉為二進制,八進制。(以后再看看pack這個函數)

====================================================================================

各種進制 的轉換:
bindec():二進制轉十進制
  1. <?php  
  2. echo bindec(1100);           //輸出12,可以加引號,也可以不加                 
  3. ?>   

 

decbin():十進制轉二進制,一樣用

dechex() :十進制轉16進制
hexdec():16進制轉10進制(參數直接寫值,不用寫0x)

octdec():八進制轉10進制
decoct():10進制轉8進制

base_convert(要轉換的數,原進制,目標進制):任意進制轉換
<?php
echo base_convert(123, 6, 2);
?>

注意:上面的這些轉換函數,由於都是數學處理函數,所以參數都不需要是字符串形式(不需要加引號),直接寫數值就行了。





免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM