搜尋
首頁php教程php手册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打开,代码如下:

如果未指定最后一个编码参数,会是三个字节为一个中文,这就是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 = 0, $append = true) 
{ 
	$str = trim($str); 
	$strlength = strlen($str); 
 
	if ($length == 0 || $length >= $strlength) 
	{ 
		return $str;  //截取长度等于0或大于等于本字符串的长度,返回字符串本身 
	} 
	elseif ($length < 0)  //如果截取长度为负数 
	{ 
		$length = $strlength + $length;//那么截取长度就等于字符串长度减去截取长度 
		if ($length < 0) 
		{ 
			$length = $strlength;//如果截取长度的绝对值大于字符串本身长度,则截取长度取字符串本身的长度 
		} 
	} 
 
	if (function_exists(&#39;mb_substr&#39;)) 
	{ 
		$newstr = mb_substr($str, 0, $length, EC_CHARSET); 
	} 
	elseif (function_exists(&#39;iconv_substr&#39;)) 
	{ 
		$newstr = iconv_substr($str, 0, $length, EC_CHARSET); 
	} 
	else 
	{ 
		//$newstr = trim_right(substr($str, 0, $length)); 
		$newstr = substr($str, 0, $length); 
	} 
 
	if ($append && $str != $newstr) 
	{ 
		$newstr .= &#39;...&#39;; 
	} 
 
	return $newstr; 
}

               
               

永久链接:

转载随意!带上文章地址吧。

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

SecLists

SecLists

SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

mPDF

mPDF

mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

DVWA

DVWA

Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中