PHP substr 截取中文乱码的问题解决办法

文章页面的 description 是使用 substr 函数来截取220字符的,但是最后一个汉字总是乱码,而且截取出来的长度也不正确。

通过神奇的 Google 找到方法,可能是因为 substr(string,start,length),会将汉字以字符的形式截断,而造成乱码

解决方案:

使用 PHP 扩展库中的 mb_substr 方法。

注意

1.确保你的Windows/system32下有php_mbstring.dll这个文件,没有就从你Php安装目录extensions里拷入Windows/system32里面。
2.在windows目录下找到php.ini打开编辑,搜索mbstring.dll,找到
;extension=php_mbstring.dll把前面的;号去掉,这样mb_substr函数就可以生效了

方法定义:

string mb_substr ( string str, int start [, int length [, string encoding]] )

注意:在使用 mb_substr()/mb_strcut 最后要加入多一个参数,以设定字符串的编码,

例如:

 代码如下 复制代码

echo mb_substr(‘原本会出现乱码的汉字!’, 0, 7, ‘utf-8′);

再如:

 代码如下 复制代码

$description = mb_substr(strip_tags($post->post_content),0,220,’utf-8′);

mb_strcut函数

mb_strcut函数功能也可以截取字符串长度,下面实例具体看看区别在哪:

 

 代码如下 复制代码

<?php
$str = '这样一来我的字符串就不会有乱码^_^';

echo "mb_substr:" . mb_substr($str, 0, 7, 'utf-8');
//结果:这样一来我的字
echo "<br>";

echo "mb_strcut:" . mb_strcut($str, 0, 6, 'utf-8');
//结果:这样
?>

从上面的例子可以看出,mb_substr是按字来切分字符,而mb_strcut是按字节来切分字符,但是都不会产生半个字符的现象。

substr()函数中文版 普通的substr()函数可以取得字符串的指定长度子字符串,但遇到中文时可能会在新字符串末尾产生乱码,下面这个函数将超过$len长度的字符串转换成以“...”结尾,并且去除了乱码。
用法:$new = getsubstring($old,20);

 代码如下 复制代码
function getsubstring($str,$len)
{
for($i = 0;$i <$len;$i++)
{
   if ($i >=0 AND $i <$len)
   {
    if(ord(substr($str,$i,1)) > 0xa1)
     $result_str.=substr($str,$i,2);
    else
     $result_str.=substr($str,$i,1);
   }
   if(ord(substr($str,$i,1)) > 0xa1)
    $i++;
}
if(strlen($str)<=$len)
   return $result_str;
else
   return $result_str."...";
}
时间: 2024-10-22 17:22:06

PHP substr 截取中文乱码的问题解决办法的相关文章

Android Studio控制台出现中文乱码(方框)问题解决办法

Android Studio控制台出现中文乱码(方框)问题解决办法 最近遇到个恶心的事儿,就使用死丢丢的时候,发现怎么我的控制台输出中文都显示方框???别人都没事,恶心坏我了.经过各种百度,终于找到解决办法,办法也是够恶心的.我们一起来看看吧. 乱码显示结果如下: 解决办法很简单,设置字体为YaHei即可.(可能之前下载的苹果编程字体不支持吧) 修改后结果可以正常显示了 再次简单做个记录, 感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

php mail发邮件标题中文乱码的问题解决办法

当使用下面的PHP语句发送电子邮件的时候,如果编码和接收邮箱编码不相同,会发现邮件的标题是乱码,而邮件正文却是正确的,如何才能使得邮件标题不是乱码呢? $subject = stripslashes($the_post['Title']); $headers = "MIME-Version: 1.0rn"; $headers .= "Content-type: text/plain; charset=utf-8rn"; $headers .= "Conte

centos 7在SecureCRT中文乱码的问题解决办法

解决Centos7中使用CRT链接的时候中文字符乱码的问题: [root@hz /]# export LC_ALL=en_US.UTF-8 思路: [root@hz /]# locale    #默认当前语言环境 LANG=en_US.UTF-8 LC_CTYPE="C" LC_NUMERIC="C" LC_TIME="C" LC_COLLATE="C" LC_MONETARY="C" LC_MESSAGE

php 解决substr()截取中文字符乱码问题_php技巧

在php中如果我要用substr()截取字符串全英文的没问题,如果包括有中文或英文就会悲剧了,但大家也 别切我们可以使用其它办法来解决. php截取中文字符串出现乱码,这是最近发现的事情,先前我曾经写过一篇关于自动生成meta信息的文章,那篇关于利用php截取文章前多少字作为description方法,但是出现了IE6无法加载CSS的现象,这里做一个补充. 首先要明确这么一个问题,之所以会出现IE6偶尔无法加载CSS的现象,是因为文件出现了乱码,导致后面的加载CSS的link无法被IE6正确解析

smarty截取中文乱码问题解决办法

smarty截取中文乱码问题解决办法 本文章提供了三款smarty截取中文乱码问题解决办法,关于乱码主要是在中文汉字中的处理了,我们利用了uft-8,gb2312等字符内码机制来截取字符串. */ function smarty_modifier_utruncate($string, $length = 80, $etc = '...',                                     $break_words = false, $middle = false)   { 

wordpress页面截取中文乱码解决办法

今天提到的程序中截取中文乱码的问题尤其是在首页,对人的第一印象是非常不友好的,现将页面乱码问题的解决方案分享以下所述.  代码如下 复制代码 <?php echo mb_strimwidth(strip_tags(apply_filters('the_content', $post->post_content)), 0, 330,"...");  ?>     以上是wordpress中的源代码,这段代码没有处理好中文的截取问题(老外的开源东西竟然没有考虑到china

C#中WebClient使用DownloadString中文乱码的解决办法

原文:C#中WebClient中文乱码的解决办法 第一次尝试:  string question = textBox1.Text.ToString(); WebClient client= new WebClient(); client.Encoding = System.Text.Encoding.GetEncoding("GB2312"); Uri uri = new Uri("http://xxxxxxxxxxxxxx"); textBox1.Text =cl

PHP读取mssql json数据中文乱码的解决办法_php实例

PHP及网页使用UTF-8编码,数据库是sql server2008,使用默认编码(936,即GBK编码) 当读取数据库数据时,使用php自带的json_encode()返回到前端,结果中文不显示. 解决办法如下: 这样,sql server 2008中的中文就可以在网页正常显示了. 如果要将中文正常插入到sql server 2008中,还要加入一条代码:$query = iconv("utf-8", "gbk//ignore", $query);//为了解决中文

解决MySQL客户端输出窗口显示中文乱码问题的办法_Mysql

最近发现,在MySQL的dos客户端输出窗口中查询表中的数据时,表中的中文数据都显示成乱码,如下图所示: 上网查了一下原因:之所以会显示乱码,就是因为MySQL客户端输出窗口显示中文时使用的字符编码不对造成的,可以使用如下的命令查看输出窗口使用的字符编码:show variables like 'char%'; 命令执行完成之后显示结果如下所示: 可以看到,现在是使用utf8字符编码来显示中文数据的,但是因为操作系统是中文操作系统,默认使用的字符集是GB2312,所以需要把输出窗口使用的字符编码