函數是這樣定義的:
int ord ( string$string)
返回字串 string 第一個字元的 ASCII 碼值。
該函數是chr()的互補函數。
試一下:
echo ord('我');
這裡只能返回230, 我是以u8儲存的檔案並輸出的, 它得到的只有230, 而230轉換成hex是e6,實際上utf-8中我的編碼是e68891, 它只拿到了第一個位元組
echo chr(0xe6).chr(0x88).chr(0x91);
這個例子可以在utf-8的情況下輸出”我“這個漢字
如果大家想瞭解字元編碼的問題可以點這裡字元編碼
如果大家想查看一個漢字的gbk,utf-8,unicode各種編碼方式推薦大家用Notepad++下的HEX-editor點擊這裡下載:
http://pan.baidu.com/s/1hquyJwo
長這樣子
提高逼格:
身為一個程式猿,除了是苦逼的代名詞外,還是神秘的象徵,偶爾裝XX還是不錯的。既然說到編碼,
那我們就說說屬於你的字吧,在utf-8編碼的世界裡,可不是每個人都能找到屬於自己的那款哦,
‘我’的編碼是三位元組,分別為e6、88、91,如果把你的生日放進去能編出啥字呢,想想是不是還有點小激動,
例如你是1988-9-4出生,那對應的屬於自己的三位元組為e9、88、94,anyway這個方法你也可以自己點,
爆個料,按照此方法,我的字是‘釉’,好字啊,you you 切克鬧。
按照此法為啥不是每個人都有呢,那自己讀下utf-8的二進位儲存規則就知道了,
哈哈,還是點這裡字元編碼
扯了一堆沒用的,其實就是希望大家發現編碼的樂趣
自己動手:
很久以前是沒有mb_substr函數的,因此帶漢字的字串截斷操作處理起來很麻煩,不過現在可以直接用它。
既然我們對字元編碼和ord函數有了很好的瞭解,自己就寫個針對utf-8編碼的字串截斷的函數吧。
代碼很戳,有待最佳化,但理解起來簡單,貼過去可以運行,基本情境也考慮到了,還算欣慰;
127){ //非ascii碼時 if($cnt >= $start){ //如果計數器走到了$start的位置 $res .=$str[$i].$str[++$i].$str[++$i]; //utf-8是三位元組編碼,$i指標連走三下,把字元存起來 $t ++; //計數器++,表示我存了幾個字串了到$num的數量就退出了 }else{ $i++; //如果沒走到$start的位置,那就只走$i指標,字元不用處理 $i++; } $cnt ++; }else{ if($cnt >= $start){ //acsii碼正常處理就好 $res .=$str[$i]; $t++; } $cnt ++; } if($num == $t) break; //ok,我要截取的數量已經夠了,我不貪婪,我退出了 } return $res; } var_dump(utf8_substr($a, 3, 10)); //結果應該是你想要的?>