ascii码扩展 php,php与ascii码
首先 簡(jiǎn)單說(shuō)一下歷史,ascii碼最開(kāi)始是美國(guó)人搞出來(lái)的,用來(lái)干什么呢?我們知道,計(jì)算機(jī)只知道0和1,如果我們要計(jì)算機(jī)識(shí)別除了01之外的字符,例如 'a',我們要先告訴計(jì)算機(jī)‘1100001’就是'a'。跟摩斯密碼一樣,敲幾下三長(zhǎng)兩短就是代表sos(開(kāi)玩笑)。所謂的字符編碼,就是跟計(jì)算機(jī)打交 道,跟計(jì)算機(jī)約定一連串的0101到底代表了什么字符。
ascii編碼是鼻祖了,不過(guò)由于ascii只有8bits,而且實(shí)際上用到的是7位,所以能表示的只有128個(gè)字符(00000000~01111111)。這128個(gè)字符包括了可打印的普通字符,也包括了不可打印的命令字符。看下表。
這128個(gè)字符,對(duì)于美國(guó)人來(lái)說(shuō),應(yīng)該是足夠了。但對(duì)于一些使用非英文字符的國(guó)家地區(qū),例如拉丁文,發(fā)文,俄文,中文,這就絕對(duì)不夠。
所以后來(lái)就有人搞了擴(kuò)展的ascii,也有人搞了新的字符編碼,在原來(lái)的8位基礎(chǔ)上擴(kuò)展到16位,32位。我們常見(jiàn)的ISOxxxx,GB2312,GBK,BIG 5,unicode....都是后來(lái)發(fā)展起來(lái)的。
雖然這 些字符編碼有些之間是不兼容,例如就中文而言,gb2312是不兼容unicode的,就是說(shuō),同一個(gè)漢字,底層約定的二進(jìn)制是不一樣的。網(wǎng)頁(yè)上的亂碼就 是出于此。但是這些后來(lái)發(fā)展的字符編碼都向下兼容了ascii。這就是為什么utf-8(unicode)和gbk/gb2312顯示英文是不會(huì)有亂碼, 而顯示中文會(huì)容易亂碼。因?yàn)樗麄兌技嫒輆scii,所以52個(gè)字母的顯示都是按ascii標(biāo)準(zhǔn)。但ascii是沒(méi)中文的,所以u(píng)nicode,gbk都按 各自標(biāo)準(zhǔn)解釋了。
從簡(jiǎn)單入手,我們先來(lái)看ascii標(biāo)準(zhǔn)的編碼。弄清楚PHP里面的二進(jìn)制,十進(jìn)制,八進(jìn)制,十六進(jìn)制,字符的表示與轉(zhuǎn)化。
先來(lái)說(shuō)一下一些表示法:
Dec:十進(jìn)制
Hex:十六進(jìn)制
Oct:八進(jìn)制
Bin:二進(jìn)制
所以數(shù)字16表示為:16D = 01H = 018O = 1000 0000B
上面這些都是一些表示法而已。方便給人看的。
=================================================================================================
現(xiàn)在有一個(gè)需求,在程序中輸入一個(gè)十六進(jìn)制數(shù),
讓計(jì)算機(jī)顯示對(duì)應(yīng)的ascii字符。例如就41H就對(duì)應(yīng)A。
方法一:
用
轉(zhuǎn)義字符:轉(zhuǎn)義字符里提供\xdd和\ddd,
\xdd表示十六進(jìn)制,\ddd表示八進(jìn)制
所以我們可以:
echo"\x41";//十六進(jìn)制,\x開(kāi)頭
echo"\101";//八進(jìn)制,隨便幾位
?>
注意:轉(zhuǎn)義字符只提供了十六進(jìn)制和八進(jìn)制轉(zhuǎn)換到字符,沒(méi)有提供二進(jìn)制、十進(jìn)制轉(zhuǎn)換到字符。所以要用另外一種方法。
方法二:
用php里面的
chr()函數(shù)。這個(gè)函數(shù)參數(shù)很簡(jiǎn)單,就是ascii碼對(duì)應(yīng)的十進(jìn)制,十六進(jìn)制,八進(jìn)制。
十進(jìn)制:直接寫整數(shù)
八進(jìn)制:
第一位肯定是0,后面隨便幾位
十六進(jìn)制:0xdd
二進(jìn)制:
字符串
注意:一定要記清楚十六進(jìn)制是0xdd
echochr(65);//十進(jìn)制,由于都輸數(shù),所以沒(méi)必要加雙引號(hào)了
echochr(0x41);//十六進(jìn)制
echochr(0101);//八進(jìn)制,三位,最高位補(bǔ)零
echochr('01000001');//二進(jìn)制,注意,這里的二進(jìn)制一定要看做字符串,加引號(hào)!上面三個(gè)都不用加
?>
方法三
用php里面的
printf/sprintf()函數(shù)格式化輸出
printf("%c",?0x41);//第二個(gè)參數(shù)一定不能用單/雙引號(hào)
printf("%c",?0101);//第二個(gè)參數(shù)一定不能用單/雙引號(hào)
printf("%c",?65);//第二個(gè)參數(shù)一定不能用單/雙引號(hào)
printf("%c",'01000001');
?>
第二個(gè)參數(shù)格式基本跟chr()的一樣,8進(jìn)制,10進(jìn)制,16進(jìn)制都不加引號(hào),二進(jìn)制就要加引號(hào)。8進(jìn)制首位為0,16進(jìn)制首位為0x。
====================================================================================
現(xiàn)在是根據(jù)一個(gè)字符提取ascii表中的對(duì)應(yīng)值
方法一:
ord()函數(shù)
echoord('A');
?>
輸出結(jié)果是65。因而這個(gè)函數(shù)只能從字符轉(zhuǎn)化到
十進(jìn)制。
注意:這個(gè)方法只提取第一個(gè)字符。如果是一個(gè)字符串,那就沒(méi)辦法處理后面的字符了。
方法二:
bin2hex()函數(shù):將字符[串]轉(zhuǎn)換為
16進(jìn)制
echobin2hex('A');
?>
輸出結(jié)果是41。
注意,這個(gè)41只是字面數(shù)值,沒(méi)有16進(jìn)制的意義。
這個(gè)函數(shù)不能用一個(gè)二進(jìn)制‘01101...’直接轉(zhuǎn)到16進(jìn)制,只能由字符串轉(zhuǎn)到16進(jìn)制,真怪
這個(gè)函數(shù)可以處理字符串
printf/sprintf()函數(shù)
.....發(fā)現(xiàn)都不行
所以,只能先用ord()轉(zhuǎn)化為十進(jìn)制,再轉(zhuǎn)為二進(jìn)制,八進(jìn)制。(以后再看看pack這個(gè)函數(shù))
====================================================================================
各種進(jìn)制 的轉(zhuǎn)換:
bindec():二進(jìn)制轉(zhuǎn)十進(jìn)制
echobindec(1100);//輸出12,可以加引號(hào),也可以不加
?>
decbin():十進(jìn)制轉(zhuǎn)二進(jìn)制,一樣用
dechex()?:十進(jìn)制轉(zhuǎn)16進(jìn)制
hexdec():16進(jìn)制轉(zhuǎn)10進(jìn)制(參數(shù)直接寫值,不用寫0x)
octdec():八進(jìn)制轉(zhuǎn)10進(jìn)制
decoct():10進(jìn)制轉(zhuǎn)8進(jìn)制
base_convert(要轉(zhuǎn)換的數(shù),原進(jìn)制,目標(biāo)進(jìn)制):任意進(jìn)制轉(zhuǎn)換
echo base_convert(123, 6, 2);
?>
注意:上面的這些轉(zhuǎn)換函數(shù),由于都是數(shù)學(xué)處理函數(shù),所以參數(shù)都不需要是字符串形式(不需要加引號(hào)),直接寫數(shù)值就行了。
總結(jié)
以上是生活随笔為你收集整理的ascii码扩展 php,php与ascii码的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 计算机课中排序选什么,《计算机应用基础课
- 下一篇: php输出12个月,php获取12个月内