首先 簡單說一下歷史,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
- echo "\x41"; //十六進制,\x開頭
- echo "\101"; //八進制,隨便幾位
- ?>
注意:轉義字符只提供了十六進制和八進制轉換到字符,沒有提供二進制、十進制轉換到字符。所以要用另外一種方法。
方法二:
用php里面的
chr()函數。這個函數參數很簡單,就是ascii碼對應的十進制,十六進制,八進制。
十進制:直接寫整數
八進制:
第一位肯定是0,后面隨便幾位
十六進制:0xdd
二進制:
字符串
注意:一定要記清楚十六進制是0xdd
- <?php
- echo chr(65); //十進制,由於都輸數,所以沒必要加雙引號了
- echo chr(0x41); //十六進制
- echo chr(0101); //八進制,三位,最高位補零
- echo chr('01000001'); //二進制,注意,這里的二進制一定要看做字符串,加引號!上面三個都不用加
- ?>
方法三
用php里面的
printf/sprintf()函數格式化輸出
- <?php
- printf("%c", 0x41); //第二個參數一定不能用單/雙引號
- printf("%c", 0101); //第二個參數一定不能用單/雙引號
- printf("%c", 65); //第二個參數一定不能用單/雙引號
- printf("%c", '01000001');
- ?>
第二個參數格式基本跟chr()的一樣,8進制,10進制,16進制都不加引號,二進制就要加引號。8進制首位為0,16進制首位為0x。
====================================================================================
現在是根據一個字符提取ascii表中的對應值
方法一:
ord()函數
- <?php
- echo ord('A');
- ?>
輸出結果是65。因而這個函數只能從字符轉化到
十進制。
注意:這個方法只提取第一個字符。如果是一個字符串,那就沒辦法處理后面的字符了。
方法二:
bin2hex()函數:將字符[串]轉換為
16進制
- <?php
- echo bin2hex('A');
- ?>
輸出結果是41。
注意,這個41只是字面數值,沒有16進制的意義。
這個函數不能用一個二進制‘01101...’直接轉到16進制,只能由字符串轉到16進制,真怪
這個函數可以處理字符串
printf/sprintf()函數
.....發現都不行
所以,只能先用ord()轉化為十進制,再轉為二進制,八進制。(以后再看看pack這個函數)
====================================================================================
各種進制 的轉換:
bindec():二進制轉十進制
- <?php
- echo bindec(1100); //輸出12,可以加引號,也可以不加
- ?>
decbin():十進制轉二進制,一樣用
dechex() :十進制轉16進制
hexdec():16進制轉10進制(參數直接寫值,不用寫0x)
octdec():八進制轉10進制
decoct():10進制轉8進制
base_convert(要轉換的數,原進制,目標進制):任意進制轉換
<?php
echo base_convert(123, 6, 2);
?>
注意:上面的這些轉換函數,由於都是數學處理函數,所以參數都不需要是字符串形式(不需要加引號),直接寫數值就行了。