導航:首頁 > 編程語言 > php截取字元串中文

php截取字元串中文

發布時間:2025-03-20 03:21:57

php如何分割中文字元串

php分割中文字元串,如果直接用PHP函數「str_split」來分割,會出現亂碼,因為中文字元長度和英文字元長度是不一樣的。

所以,可以建立新的函數先把字元轉成ASCII值,接著通過判斷不同字元的長度來正確分割中文字元串,把結果存入數組,最後再用PHP函數「join」在字元間插入百分號。

具體參考代碼如下:

<?php
functionstr_split_utf8($str){
$split=1;
$array=array();
for($i=0;$i<strlen($str)){
$value=ord($str[$i]);
if($value>127){
if($value>=192&&$value<=223)$split=2;
elseif($value>=224&&$value<=239)$split=3;
elseif($value>=240&&$value<=247)$split=4;
}else{
$split=1;
}
$key=NULL;
for($j=0;$j<$split;$j++,$i++){
$key.=$str[$i];
}
array_push($array,$key);
}
return$array;
}
$string="網路知道www..cn";
$arr1=str_split_utf8($string);
echojoin("%",$arr1);
?>

Ⅱ php關於截取中文字元串的問題

php中文亂碼的原因及解決方法
原因:1.php頁面語言本身的編碼類型不合適,這時候,你直接在腳本中寫的中文肯定是亂碼,不用說資料庫了;
解決方法:選擇'utf8'或者'薯鄭gb2312',這樣客戶瀏覽器會自動選擇並出現正確的中文顯示。注意:'utf8'或者'gb2312'都可以正確顯示中文的。
2.資料庫mysql中的編碼類型不正確。
解決方法:創建資料庫的時候,mysql
字元集選擇'utf8',mysql
連接校對選擇utf8_general_ci,這樣創建的資料庫用來存儲中文肯定沒有問題,
否則,你的中文首先在mysql中就是亂碼,更不要期望它會給你在php頁面中顯示正確。
3.與平時的腳本編輯握辯環境有關。比如,有些內容是自己用word寫的,有些是用記事本寫的,有些用editplus、ultraplus等文本編輯器。有時候就直接在dw中寫中文了,
這樣做不出亂碼才怪呢。
解決方法:盡量用同一種編輯器。如果是拷貝來得既有的內容,建議用ultraplus中的編碼轉換功能把它轉換成utf8或者gb2312。
到底轉換成什麼類型並不重要,關鍵要求你的php
web應用程序中的編碼要一致就行。
4.編程訪問
mysql時,建議添加段手缺一行代碼:mysql_query("set
names
'gbk'");
這是解決方法
我沒看懂你貼上來的程序
所以給你一些方法去解決亂碼的問題
希望可以幫得上

Ⅲ PHP中使用substr截取字元串出現中文亂碼問題該怎麼辦

在PHP程序開發中,經常會執行字元串的截取操作,比如輸出信息列表時,標題不宜過長,列印文章摘要時,也要執行一系列的字元串截取操作。遇到這些需求時,我春皮們經常會想到使用substr()方法來實現,substr()對全英文字元串的截取是比較適合的。

但字元串只要出現中文字元,就有可能導致PHP
substr中文亂碼,因為中文UTF-8編碼,每個漢字佔3位元組,而GB2312佔2位元組,英文佔1位元組,截取位數不準確,substr()硬生生地將
一個中文字元「鋸」成兩半,造成斷開的字元會把其後的..拉過來一起做一個字,所以出現了PHP substr中文亂碼。

substr --- 取得部份字元串

語法 : string substr (string string, int start [, int length])

說明 :

substr( )傳回 string的一部份字元串,由參數 start和 length指定。

如果 start是正數扒搏差,傳回的字元串將會從 string的第 start個字元開始。

Example :

<?php
$rest = substr ("abcdef", 1); // returns "bcdef"
$rest = substr ("abcdef", 1, 3); // returns "bcd"
?>

如果 start是負數,傳回的字元串將會從 string結尾的第 start個字開始。

Example :

<?php
$rest = substr ("abcdef", -1); // returns "f"
$rest = substr ("abcdef", -2); // returns "ef"
$rest = substr ("abcdef", -3, 1); // returns "d"
?>

如果有給予參數 length而且是正數時,傳回的字元串將會從 start傳回 length個字元。
如果有給予參數 length而且是負數時,傳回的字元串將會結束於 string結尾的第 length個字元。

Example :

<?php
$rest = substr ("abcdef", 1, -1); // returns "bcde"
?>

對於英文沒有問題,我們測試一個中文

<?php
$rest = substr ("中國人", 1, -1); // returns "fdsafsda" 就是亂碼了
?>

這種截取字元的結果,肯定不是我們想要的結果,這種出現PHP substr中文亂碼的銀腔情況,可能會導致程序無法正常運行。解決辦法主要有兩種:

一、使用mbstring擴展庫的mb_substr()截取就不會出現亂碼了。

可以用mb_substr()/mb_strcut()這個函數,mb_substr()/mb_strcut()的用法與substr()相似,
只是在mb_substr()/mb_strcut最後要加入多一個參數,以設定字元串的編碼,但是一般的伺服器都沒打開
php_mbstring.dll,需要在php.ini在把php_mbstring.dll打開。

<?php
echo mb_substr("php中文字元encode",0,4,"utf-8");
?>

如果未指定最後一個編碼參數,會是三個位元組為一個中文,這就是utf-8編碼的特點,若加上utf-8字元集說明,所以,是以一個字為單位來截取的。

使用的時候要注意php文件的編碼,和網頁顯示時的編碼。使用這個mb_substr方法要事先知道字元串的編碼,如果不知道編碼,就需要判斷,mbstring庫還提供了mb_check_encoding來檢驗字元串編碼,但還不完善。

PHP 自帶幾種字元串截取函數,其中常用到的就是 substr 和 mb_substr。前者在處理中文時,GBK 為 2 個長度單位,UTF 為 3 個長度單位,後者指定編碼後,一個中文即為 1 個長度單位。

substr 有時會截 1/3 個中文或半個中文,會顯示亂碼,相對來說 mb_substr 更適合我們使用。不過有時候 mb_substr
就顯得不那麼好用了。例如我要顯示一個小圖片的簡要信息,5 個中文正好,超過 5 個就截取前4再加上
」…」,這樣處理中文是沒問題了,可是處理英文或數字,這樣截取就太短了。

二、自己書寫截取函數,但效率不如用mbstring擴展庫來得高。下面是ecshop裡面的截取UTF-8編碼下字元串的函數。

function sub_str($str, $length = , $append = true)
{
$str = trim($str);
$strlength = strlen($str);
if ($length == || $length >= $strlength)
{
return $str; //截取長度等於或大於等於本字元串的長度,返回字元串本身
}
elseif ($length < ) //如果截取長度為負數
{
$length = $strlength + $length;//那麼截取長度就等於字元串長度減去截取長度
if ($length < )
{
$length = $strlength;//如果截取長度的絕對值大於字元串本身長度,則截取長度取字元串本身的長度
}
}
if (function_exists('mb_substr'))
{
$newstr = mb_substr($str, , $length, EC_CHARSET);
}
elseif (function_exists('iconv_substr'))
{
$newstr = iconv_substr($str, , $length, EC_CHARSET);
}
else
{
//$newstr = trim_right(substr($str, , $length));
$newstr = substr($str, , $length);
}
if ($append && $str != $newstr)
{
$newstr .= '...';
}
return $newstr;
}

Ⅳ php如何獲取中文字元長度,一個中文字元算一個

在PHP中專門的mb_substr和mb_strlen函數,可以對中文進行截取和計算長度,但是,由於這些函數並非PHP的核心函數,所以,它們常常有可能沒有開啟。要在php.ini中開啟即可。獲取長度實例:1 ,utf-8環境下使用

header('Content-type:text/html;charset=utf-8');
/**
*可以統計中文字元串長度的函數
*@param$str要計算長度的字元串
*@param$type計算長度類型,0(默認)表示一個中文算一個字元,1表示一個中文算兩個字元
*
*/
functionabslength($str)
{
if(empty($str)){
return0;
}
if(function_exists('mb_strlen')){
returnmb_strlen($str,'utf-8');
}
else{
preg_match_all("/./u",$str,$ar);
returncount($ar[0]);
}
}
$str='我們都是中國人啊,ye!';
$len=abslength($str);
var_mp($len);//return12
$len=abslength($str,'1');
echo'<br/>'.$len;//return22

/*
utf-8編碼下截取中文字元串,參數可以參照substr函數
@param$str要進行截取的字元串
@param$start要進行截取的開始位置,負數為反向截取
@param$end要進行截取的長度
*/
functionutf8_substr($str,$start=0){
if(empty($str)){
returnfalse;
}
if(function_exists('mb_substr')){
if(func_num_args()>=3){
$end=func_get_arg(2);
returnmb_substr($str,$start,$end,'utf-8');
}
else{
mb_internal_encoding("UTF-8");
returnmb_substr($str,$start);
}

}
else{
$null="";
preg_match_all("/./u",$str,$ar);
if(func_num_args()>=3){
$end=func_get_arg(2);
returnjoin($null,array_slice($ar[0],$start,$end));
}
else{
returnjoin($null,array_slice($ar[0],$start));
}
}
}
$str2='wo要截取zhongwen';
echo'<br/>';
echoutf8_substr($str2,0,-4);//returnwo要截取zhon

2,支持gb2312,gbk,utf-8,big5 中文截取方法

/*

* 中文截取,支持gb2312,gbk,utf-8,big5

*

* @param string $str 要截取的字串

* @param int $start 截取起始位置

* @param int $length 截取長度

* @param string $charset utf-8|gb2312|gbk|big5 編碼

* @param $suffix 是否加尾綴

*/

public function csubstr($str, $start=0, $length, $charset="utf-8", $suffix=true)

{

if(function_exists("mb_substr"))

{

if(mb_strlen($str, $charset) <= $length) return $str;

$slice = mb_substr($str, $start, $length, $charset);

}

else

{

$re['utf-8'] = "/[x01-x7f]|[xc2-xdf][x80-xbf]|[xe0-xef][x80-xbf]{2}|[xf0-xff][x80-xbf]{3}/";

$re['gb2312'] = "/[x01-x7f]|[xb0-xf7][xa0-xfe]/";

$re['gbk'] = "/[x01-x7f]|[x81-xfe][x40-xfe]/";

$re['big5'] = "/[x01-x7f]|[x81-xfe]([x40-x7e]|xa1-xfe])/";

preg_match_all($re[$charset], $str, $match);

if(count($match[0]) <= $length) return $str;

$slice = join("",array_slice($match[0], $start, $length));

}

if($suffix) return $slice."…";

return $slice;

}

Ⅳ php中explode截取中文又亂碼,求解~~

如下面例子,在GBK編碼下會產生亂碼。
原因,在php6之前,字元是以位元組形式存在的,字元"碪"的gbk位元組碼是"B4 55",而字元"U"的位元組碼是"55",在explode函數中第一個參數的字元串會轉成相應的位元組,然後和第二個參數的位元組碼比對,進行分割。
在下面例子中就是 55 分割 B4 55 B4 55 55 B4 55 B4 55 ,所以"碪"字被分割了。

這種情況很多,所以在php中使用explode時應多注意!

<?php
$result = explode("U", "碪碪U碪碪");
print_r($result);
?>

我也碰到這問題了,正在研究字母解決

閱讀全文

與php截取字元串中文相關的資料

熱點內容
mt伺服器怎麼下載迷你體驗服 瀏覽:367
新創建文件夾怎麼放置在文件夾中 瀏覽:777
嘉興電子文檔加密軟體供應商 瀏覽:139
華為手機怎麼加密視頻 瀏覽:763
湖南奇幻解壓管 瀏覽:671
蘋果平板中怎麼刪除查找app 瀏覽:303
linux配dns 瀏覽:350
仿生機器人編程 瀏覽:662
摳圖哪個app最好 瀏覽:327
玉林市公司程序員 瀏覽:106
單片機點陣顯示文字16 瀏覽:771
電腦怎麼對手機進行加密 瀏覽:719
手機遠程騰訊雲伺服器電腦安全嗎 瀏覽:283
怎麼在智慧屏上安裝米家app 瀏覽:37
焦慮解壓冥想師 瀏覽:166
re管理器怎麼提取u盤app 瀏覽:906
php和類名相同的方法 瀏覽:360
香港台灣dns伺服器地址列表 瀏覽:537
大同app怎麼樣 瀏覽:438
php去掉特殊字元 瀏覽:387