php截取字符串后编码不对,php截取字符串出现中文乱码问题的解决
在之前的文章中我们给大家接好了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截取字符串出现中文乱码问题的解决相关推荐
- 字符串分隔 -连续输入字符串,请按长度为8拆分每个字符串后输出到新的字符串数组; •长度不是8整数倍的字符串请在后面补数字0,空字符串不处理。...
•连续输入字符串,请按长度为8拆分每个字符串后输出到新的字符串数组: •长度不是8整数倍的字符串请在后面补数字0,空字符串不处理. 输入描述: 连续输入字符串(输入2次,每个字符串长度小于100) 输 ...
- •连续输入字符串,请按长度为8拆分每个字符串后输出到新的字符串数组; •长度不是8整数倍的字符串请在后面补数字0,空字符串不处理。
•连续输入字符串,请按长度为8拆分每个字符串后输出到新的字符串数组: •长度不是8整数倍的字符串请在后面补数字0,空字符串不处理. 1. 首先从第二条规定,可以看出,需要用到字符串的添加,我们考虑用S ...
- base64编码相关-btoa和atob及中文乱码报错问题
base64编码相关-btoa和atob及中文乱码报错问题 最近在做二进制编码相关的东西,关于Base64的编码解码问题.遇到了一些问题. btoa(); btoa函数全称就是Binary-to-AS ...
- notepad++打开文件后,我再用记事本打开中文乱码解决办法
notepad++打开文件后,我再用记事本打开中文乱码 用natepad++打开文本,然后将编码方式 改成ANSI编码就能解决该问题
- Idea 设置编码UTF-8 Idea中 .properties 配置文件中文乱码
Idea 设置编码UTF-8 Idea中 .properties 配置文件中文乱码 一.设置编码 1.步骤: File -> Setting -> Editor -> File en ...
- 字符串的编码与构造、字符串格式化、字符串的截取、字符串常用函数、正则表达式
文章目录 了解ASCII码 UTF-8编码 字符串构造 单引号或双引号构造字符串 单双引号构造字符串的特殊用法 字符串中引号的转义 转义字符 原始字符串 三重引号字符 字符串格式化 %符号格式化字符串 ...
- java截取字符串后几位_java截取字符串后几位字符的方法
java截取字符串后几位字符的方法: java中截取字符串中最后几个字符可以使用String类的substring方法,具体用法参考下方说明: 1.substring(int beginIndex)s ...
- js怎样截取字符串后几位以及截取字符串前几位
截取字符串前几位var disName ='开心一族漂亮家园'; var shortName = disName.substring(0,5); console.log(shortName);//打印 ...
- python中对字符串进行编码_Python 中的字符串编码
对Python字符编码一直没搞明白,今天看<Python参考手册>再次遇到这个问题,重新整理下 Python中字符串字面量用于指定一个字符序列,其定义方法是把文本放入单引号('),双引号( ...
最新文章
- 微信第一行代码曝光!从「扫地僧」到「地成佛」,张小龙10年磨一剑
- 音乐播放器的实现-音乐文件的获取(1)
- Java 如何有效地避免OOM:善于利用软引用和弱引用
- 关于expanded一级二级菜单数据的分组排序
- [草稿]尝试从 same.com 的视角观察简书的用户社交网络
- c#连接mysql数据库,增删查改命令执行
- 010 Editor for Mac(十六进制编辑器)v12.0
- 产品经理是怎样炼成的
- World Wind入门
- 公司邮箱通讯录的更新
- Kite Compositor制作下雨打雷特效详细教学
- windows下制作linux U盘启动盘或者安装优盘(转)
- HMAC-MD5签名的Java实现
- 华为云cce生态环境搭建整理
- 人工智能小白日记之2准备篇
- android l 论坛,同步更新魔趣源码Android-L编译
- MBR60200PT-ASEMI肖特基二极管常见型号MBR60200PT
- 百度评论中台的设计与探索
- 安装vuecli(5.0.8版本)
- 关于Android适配华为等带有底部虚拟按键的解决方案