程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> PHP中截取中文亂碼解決辦法

PHP中截取中文亂碼解決辦法

編輯:關於PHP編程

如果ASCii碼大於0xa0就是半個漢字;了解substr()、mb_substr()、ord()。 現在常用的編碼格式是UTF8,GBK,GBK2312,BIG5。GBK是GBK2312的升級。現在我開發中遇到的基本都是UTF8,GBK常用在論壇BBS上。今天自己寫了下UTF8的,測試下還說的過去,畢竟從網上拷下來的是可以用,但是如果有時間最好還是自己寫一下,這樣只有到自己手裡的才是自己的。

最簡的就是利用

例子 1

 代碼如下 復制代碼

<?php
echo substr("Hello world!",6);
?>輸出:

world!

例子 2
<?php
echo substr("Hello world!",6,5);
?>

英文的話沒有問題,但是中文就出問題了,下面我們使用mb_substr函數處理。

/**
*—————————————————————————————————————–
*PHP有一個mbstring擴展庫可以用(有朋友面試PHP的時候還被問到過這個問題哦),但是  *
一般的服務器都沒打開php_mbstring.dll,需要在
*php.ini裡把php_mbstring.dll打開,如果沒有權限的話就只有聯系你的ISP了。
*因為mb_string的效率高一些,所以我們先檢查一下mb_string是否可以用:
*—————————————————————————————————————–
*/

 代碼如下 復制代碼

if(function_exists(‘mb_string’))
{
mb_substr($string,$start,$length,$encoding);
//other codes here
}
else mysubstr($string,$start,$length);// 調用自己的函數
?>

首先定義自己的函數

 代碼如下 復制代碼

<?php
/**
*———————————-
*首先定義自己的函數:
*———————————-
*/
function mysubstr($string, $start, $length)
{
if(strlen($string)>$length)
{
$str=”;
$len=$start+$length;
for($i=$start;$i<$len;$i++)
{
if(ord(substr($string,$i,1))>0xa0)
{
$str.=substr($string,$i,2);
$i++;
}
else{ $str.=substr($string,$i,1);}
}
return $str.’…’;
}
else{ return $string;}
}

 

還有一個問題要注意,使用這種方法的時候,你的<head>標簽對裡的charset只有設成中文的編碼才可以,如GBK,GB2312。

下面自己常用的一個中英文字符截取函數

自定義截取中文字符串函數,基本上就是仿照mb_substr寫個函數,直接調用罷了,以下為我找到的代碼,其實很簡單

 代碼如下 復制代碼

<?php 
function  substr_cn($string_input,$start,$length)
{
    /* 功能:
     * 此算法用於截取中文字符串
     * 函數以單個完整字符為單位進行截取,即一個英文字符和一個中文字符均表示一個單位長度
     * 參數:
     * 參數$string為要截取的字符串,
     * 參數$start為欲截取的起始位置,
     * 參數$length為要截取的字符個數(一個漢字或英文字符都算一個)
     * 返回值:
     * 返回截取結果字符串
     * */
    $str_input=$string_input;
    $len=$length;
    $return_str="";
    //定義空字符串
    for ($i=0;$i<2*$len+2;$i++)
        $return_str=$return_str." ";
    $start_index=0;
    //計算起始字節偏移量
    for ($i=0;$i<$start;$i++)
    {
        if (ord($str_input{$start_index}>=161))          //是漢語     
        {
            $start_index+=2;
        }
        else                                          //是英文
        {
            $start_index+=1;
        }        
    }    
    $chr_index=$start_index;
    //截取
    for ($i=0;$i<$len;$i++)
    {
        $asc=ord($str_input{$chr_index});
        if ($asc>=161)
        {
            $return_str{$i}=chr($asc);
            $return_str{$i+1}=chr(ord($str_input{$chr_index+1}));
            $len+=1; //結束條件加1
            $i++;    //位置偏移量加1
            $chr_index+=2;
            continue;            
        }
        else 
        {
            $return_str{$i}=chr($asc);
            $chr_index+=1;
        }
    }    
    return trim($return_str);
}//end of substr_cn
?>

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved