在之前的文章中我们给大家接好了php截取字符串的实现,以及php截取中文字符串的使用,那么我们在截取中文字符串的时候,很多时候都会出现乱码的问题,那么我们今天就给大家介绍php截取字符串出现中文乱码问题的解决!

PHP用substr截取字符串出现中文乱码问题用mb_substr

实例:mb_substr('截取中文乱码问题测试',0,5, 'utf-8');

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

$rest = substr ("abcdef", 1); // returns "bcdef"

$rest = substr ("abcdef", 1, 3); // returns "bcd"

如果 start是负数,传回的字符串将会从 string结尾的第 start个字开始。$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个字元。$rest = substr ("abcdef", 1, -1); // returns "bcde"

对于英文没有问题,我们测试一个中文$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打开。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截取字符串后编码不对,php截取字符串出现中文乱码问题的解决相关推荐

  1. 字符串分隔 -连续输入字符串,请按长度为8拆分每个字符串后输出到新的字符串数组; •长度不是8整数倍的字符串请在后面补数字0,空字符串不处理。...

    •连续输入字符串,请按长度为8拆分每个字符串后输出到新的字符串数组: •长度不是8整数倍的字符串请在后面补数字0,空字符串不处理. 输入描述: 连续输入字符串(输入2次,每个字符串长度小于100) 输 ...

  2. •连续输入字符串,请按长度为8拆分每个字符串后输出到新的字符串数组; •长度不是8整数倍的字符串请在后面补数字0,空字符串不处理。

    •连续输入字符串,请按长度为8拆分每个字符串后输出到新的字符串数组: •长度不是8整数倍的字符串请在后面补数字0,空字符串不处理. 1. 首先从第二条规定,可以看出,需要用到字符串的添加,我们考虑用S ...

  3. base64编码相关-btoa和atob及中文乱码报错问题

    base64编码相关-btoa和atob及中文乱码报错问题 最近在做二进制编码相关的东西,关于Base64的编码解码问题.遇到了一些问题. btoa(); btoa函数全称就是Binary-to-AS ...

  4. notepad++打开文件后,我再用记事本打开中文乱码解决办法

    notepad++打开文件后,我再用记事本打开中文乱码 用natepad++打开文本,然后将编码方式 改成ANSI编码就能解决该问题

  5. Idea 设置编码UTF-8 Idea中 .properties 配置文件中文乱码

    Idea 设置编码UTF-8 Idea中 .properties 配置文件中文乱码 一.设置编码 1.步骤: File -> Setting -> Editor -> File en ...

  6. 字符串的编码与构造、字符串格式化、字符串的截取、字符串常用函数、正则表达式

    文章目录 了解ASCII码 UTF-8编码 字符串构造 单引号或双引号构造字符串 单双引号构造字符串的特殊用法 字符串中引号的转义 转义字符 原始字符串 三重引号字符 字符串格式化 %符号格式化字符串 ...

  7. java截取字符串后几位_java截取字符串后几位字符的方法

    java截取字符串后几位字符的方法: java中截取字符串中最后几个字符可以使用String类的substring方法,具体用法参考下方说明: 1.substring(int beginIndex)s ...

  8. js怎样截取字符串后几位以及截取字符串前几位

    截取字符串前几位var disName ='开心一族漂亮家园'; var shortName = disName.substring(0,5); console.log(shortName);//打印 ...

  9. python中对字符串进行编码_Python 中的字符串编码

    对Python字符编码一直没搞明白,今天看<Python参考手册>再次遇到这个问题,重新整理下 Python中字符串字面量用于指定一个字符序列,其定义方法是把文本放入单引号('),双引号( ...

最新文章

  1. 微信第一行代码曝光!从「扫地僧」到「地成佛」,张小龙10年磨一剑
  2. 音乐播放器的实现-音乐文件的获取(1)
  3. Java 如何有效地避免OOM:善于利用软引用和弱引用
  4. 关于expanded一级二级菜单数据的分组排序
  5. [草稿]尝试从 same.com 的视角观察简书的用户社交网络
  6. c#连接mysql数据库,增删查改命令执行
  7. 010 Editor for Mac(十六进制编辑器)v12.0
  8. 产品经理是怎样炼成的
  9. World Wind入门
  10. 公司邮箱通讯录的更新
  11. Kite Compositor制作下雨打雷特效详细教学
  12. windows下制作linux U盘启动盘或者安装优盘(转)
  13. HMAC-MD5签名的Java实现
  14. 华为云cce生态环境搭建整理
  15. 人工智能小白日记之2准备篇
  16. android l 论坛,同步更新魔趣源码Android-L编译
  17. MBR60200PT-ASEMI肖特基二极管常见型号MBR60200PT
  18. 百度评论中台的设计与探索
  19. 安装vuecli(5.0.8版本)
  20. 关于Android适配华为等带有底部虚拟按键的解决方案

热门文章

  1. Became Jane(成为简.奥斯丁)
  2. 什么时候对象可以被收回?
  3. shell脚本手动执行成功,定时任务调用失败的解决方法。
  4. Arrays.asList()的坑
  5. 截至2018年,目前,企业主流的消息中间件有哪些?各有什么优缺点?面试常问 RabbitMQ使用较多
  6. errgroup 分析
  7. php const用法详解
  8. ajax post 与get方法 data写法
  9. RocketMQ架构
  10. OSSemPend()--等待一个信号量