PHP正確解析UTF-8字符串技巧應(yīng)用
更新時間:2012年11月07日 11:53:49 作者:
總結(jié)了一個UTF-8的編碼規(guī)則,根據(jù)這個編碼規(guī)則,寫一個UTF-8編碼的解析程序,以下是PHP的實(shí)現(xiàn),需要的朋友可以參考下
在《學(xué)習(xí)PHP&MYSQL之——字符編碼篇(一)》中介紹了Unicode與UTF-8的轉(zhuǎn)換關(guān)系,總結(jié)了一個UTF-8的編碼規(guī)則,根據(jù)這個編碼規(guī)則,寫一個UTF-8編碼的解析程序,以下是PHP的實(shí)現(xiàn):
<?php
/*
程序功能,$str是中英文混合的UTF-8編碼字符串,
將此字符串根據(jù)UTF-8的編碼規(guī)則正確的解碼并顯示。
*/
$str = '今天非常Happy,所有決定去KFC吃可樂雞翅!!!';
/*
$str 是待截取的字符串
$len 是截取的字符數(shù)
*/
function utf8sub($str,$len) {
if($len <= 0){
return '';
}
$offset = 0; // 截取高位字節(jié)時的偏移量
$chars = 0; // 截取到的字符數(shù)
$res = ''; // 存放截取的結(jié)果字符串
while($chars < $len){
// 先取字符串的第一個字節(jié)
// 將它轉(zhuǎn)為十進(jìn)制
// 再轉(zhuǎn)為二進(jìn)制
$high = ord(substr($str,$offset,1));
// echo '$high='. $high .'<br />';
if($high == null ){ // 如果取出高位為null,證明已經(jīng)取到末尾,直接break
break;
}
if(($high>>2) === 0x3F){ // 將高位右移2位,和二進(jìn)制111111比較,相同則取6個字節(jié)
// 截取2個字節(jié)
$count = 6;
}else if(($high>>3) === 0x1F){ // 將高位右移2位,和二進(jìn)制11111比較,相同則取5個字節(jié)
// 截取3個字節(jié)
$count = 5;
}else if(($high>>4) === 0xF){ // 將高位右移2位,和二進(jìn)制1111比較,相同則取4個字節(jié)
// 截取4個字節(jié)
$count = 4;
}else if(($high>>5) === 0x7){ // 將高位右移2位,和二進(jìn)制111比較,相同則取3個字節(jié)
// 截取5個字節(jié)
$count = 3;
}else if(($high>>6) === 0x3){ // 將高位右移2位,和二進(jìn)制11比較,相同則取2個字節(jié)
// 截取6個字節(jié)
$count = 2;
}else if(($high>>7) === 0x0){ // 將高位右移2位,和二進(jìn)制0比較,相同則取1個字節(jié)
$count = 1;
}
// echo '$count='.$count.'<br />';
$res .= substr($str,$offset,$count); // 取出一個字符與$res字符串連接
$chars += 1; // 截取到的字符數(shù)+1
$offset += $count; // 截取高位偏移量向后移$count字節(jié)
}
return $res;
}
echo utf8sub($str,100);
復(fù)制代碼 代碼如下:
<?php
/*
程序功能,$str是中英文混合的UTF-8編碼字符串,
將此字符串根據(jù)UTF-8的編碼規(guī)則正確的解碼并顯示。
*/
$str = '今天非常Happy,所有決定去KFC吃可樂雞翅!!!';
/*
$str 是待截取的字符串
$len 是截取的字符數(shù)
*/
function utf8sub($str,$len) {
if($len <= 0){
return '';
}
$offset = 0; // 截取高位字節(jié)時的偏移量
$chars = 0; // 截取到的字符數(shù)
$res = ''; // 存放截取的結(jié)果字符串
while($chars < $len){
// 先取字符串的第一個字節(jié)
// 將它轉(zhuǎn)為十進(jìn)制
// 再轉(zhuǎn)為二進(jìn)制
$high = ord(substr($str,$offset,1));
// echo '$high='. $high .'<br />';
if($high == null ){ // 如果取出高位為null,證明已經(jīng)取到末尾,直接break
break;
}
if(($high>>2) === 0x3F){ // 將高位右移2位,和二進(jìn)制111111比較,相同則取6個字節(jié)
// 截取2個字節(jié)
$count = 6;
}else if(($high>>3) === 0x1F){ // 將高位右移2位,和二進(jìn)制11111比較,相同則取5個字節(jié)
// 截取3個字節(jié)
$count = 5;
}else if(($high>>4) === 0xF){ // 將高位右移2位,和二進(jìn)制1111比較,相同則取4個字節(jié)
// 截取4個字節(jié)
$count = 4;
}else if(($high>>5) === 0x7){ // 將高位右移2位,和二進(jìn)制111比較,相同則取3個字節(jié)
// 截取5個字節(jié)
$count = 3;
}else if(($high>>6) === 0x3){ // 將高位右移2位,和二進(jìn)制11比較,相同則取2個字節(jié)
// 截取6個字節(jié)
$count = 2;
}else if(($high>>7) === 0x0){ // 將高位右移2位,和二進(jìn)制0比較,相同則取1個字節(jié)
$count = 1;
}
// echo '$count='.$count.'<br />';
$res .= substr($str,$offset,$count); // 取出一個字符與$res字符串連接
$chars += 1; // 截取到的字符數(shù)+1
$offset += $count; // 截取高位偏移量向后移$count字節(jié)
}
return $res;
}
echo utf8sub($str,100);
您可能感興趣的文章:
- php parse_str() 函數(shù)的定義和用法
- php使用parse_url和parse_str解析URL
- 淺談PHP解析URL函數(shù)parse_url和parse_str
- PHP中可以自動分割查詢字符的Parse_str函數(shù)使用示例
- PHP入門教程之字符串處理技巧總結(jié)(轉(zhuǎn)換,過濾,解析,查找,截取,替換等)
- php遍歷解析xml字符串的方法
- php一個解析字符串排列數(shù)組的方法
- php解析字符串里所有URL地址的方法
- php解析http獲取的json字符串變量總是空白null
- 解析php獲取字符串的編碼格式的方法(函數(shù))
- php使用parse_str實(shí)現(xiàn)查詢字符串解析到變量中的方法
相關(guān)文章
利用文件屬性結(jié)合Session實(shí)現(xiàn)在線人數(shù)統(tǒng)計
利用文件屬性結(jié)合Session實(shí)現(xiàn)在線人數(shù)統(tǒng)計...2006-10-10PHP PDOStatement::fetchObject講解
今天小編就為大家分享一篇關(guān)于PHP PDOStatement::fetchObject講解,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2019-02-02