substr是不安全的
今天遇到一个问题,数据库中保存的内容通过php在页面无法显示,如果将内容换行或加个空格或者随便加点其他内容就能正常显示。
非常的诡异,显示的内容是通过截取得到的。代码非常简单
substr($pMarketInfo['description'], 0, 150) . '...';
原始内容是:
Set on a huge 809m2 block, there is plenty of room for the pets and the little ones and with side access
• Floor to ceiling tiles in the bathroom
• Built in robe to main bedroom
最后终于查明了原因。用substr截取内容,到第150个正好碰到了'•'这个特殊符号,substr是不安全的,他截取的是字节(bytes),a占一个字节,b占一个字节。汉字及有些符号会占用多字节(到底占几个跟编码有关),所以他会将'•'这个特殊符号一截两半,变成不完整的。
php解析的时候由于不认得这半个字符,造成中断,所以最终不显示。
安全的做法是使用
mb_substr($pMarketInfo['description'], 0, 150, 'utf-8') . '...';
比substr()多出一个编码参数,如果不指定会使用内部的编码。内部编码通过mb_internal_encoding()获得。
//输出:我们都
echo mb_substr('我们都是好孩子hehe',0,9); echo "<br>";
//输出:我们都是好孩子he
echo mb_substr('我们都是好孩子hehe',0,9,'utf-8');
第一个是以三个字节为一个中文,这就是utf-8编码的特点,下面加上utf-8字符集说明,所以,是以一个字为单位来截取的。
注:
ANSI 中文字符2、英文字符1字节
UTF-8 中文字符3、英文字符1字节
Unicode 中文字符2、英文字符2字节
substr是不安全的的更多相关文章
- ThinkPHP 模板substr的截取字符串函数
ThinkPHP 模板substr的截取字符串函数在Common/function.php加上以下代码 /** ** 截取中文字符串 **/ function msubstr($str, $start ...
- JavaScript中的slice,splice,substr,substring,split的区别
万恶的输入法,在sublime中会显示出繁体字,各位看官见谅. 1.slice()方法:该方法在数组和string对象中都拥有. var a = [1,2,3,4,5,6]; var s = 'thi ...
- substr()函数
substr 定义于头文件 <string> string substr (size_t pos = 0, size_t len = npos) const;复制子字符串,要求从指定位置开 ...
- js中substr,substring,slice。截取字符串的区别
substr(n1,n2) n1:起始位置(可以为负数) n2:截取长度(不可以为0,不可以为负数,可以为空) 当n1为正数时,从字符串的n1下标处截取字符串(起始位置),长度为n2. 当n1为负数时 ...
- js中substr,substring,indexOf,lastIndexOf的用法小结
第一组:str.substr(start,length) 和 str.substring(start,end) 定义: str.substr(start,length) substr(start,le ...
- js 中 substring() 和 substr() 提取字符
提取字符串substring() substring() 方法用于提取字符串中介于两个指定下标之间的字符. 语法: stringObject.substring(startPos,stopPos) ...
- substr 与 substring 的区别
substr (start[, 所要子川的长度]); substring(start, 结束的位置)
- subString(), subStr(),splice(),split()的区别
1.slice(): Array和String对象都有 在Array中 slice(i,[j]) i为开始截取的索引值,负数代表从末尾算起的索引值,-1为倒数第一个元素 j为结束的索引值,缺省时则获 ...
- 日常积累之JSON.stringify和JSON.parse substr
1.substr(start,len) 从字符串中读取内容,第一个参数是读取的首位置,如果为负数,则从末尾倒数计数. 第二个参数是要读取的长度. eg: var str = "silence ...
- LeetCode 5 Longest Palindromic Substring manacher算法,最长回文子序列,string.substr(start,len) 难度:2
https://leetcode.com/problems/longest-palindromic-substring/ manacher算法相关:http://blog.csdn.net/ywhor ...
随机推荐
- Java虚拟机5:常用JVM命令参数
这里汇总一些平时用到的.看到的一些虚拟机参数: (1)-Xms20M 表示设置堆容量的最小值为20M,必须以M为单位 (2)-Xmx20M 表示设置堆容量的最大值为20M,必须以M为单位.将-Xmx和 ...
- 输出预测边界框,NMS非极大值抑制
我们预测阶段时: 生成多个锚框 每个锚框预测类别和偏移量 但是,当同一个目标上可能输出较多的相似的预测边界框.我们可以移除相似的预测边界框.——NMS(非极大值抑制). 对于一个预测边界框B,模型会计 ...
- 【Hankson 的趣味题】
可能我只适合这道题的50分 但还是要争取一下的 我们知道对于\(gcd\)和\(lcm\)有这样的定义 \(a=\prod _{i=1}^{\pi(a)}p_i^{d_{i}}\) \(b=\prod ...
- ASP.NET SignalR 与 LayIM2.0 配合轻松实现Web聊天室 实战系列(内容已过期,阅读请慎重)
项目简介 利用ASP.NET SignalR技术与Layim前端im框架实现的一个简单的web聊天室,包括单聊,群聊,加好友,加群,好友搜索,管理,群组管理,好友权限设置等功能.涉及技术: Elast ...
- logback配置与使用(2)
转载:yaoh371 的logback.xml常用配置 <?xml version="1.0" encoding="UTF-8"?> <!-- ...
- maven编译package慢
mvn package编译出现连接不上mvn库的问题: [root@localhost nnnnn]# mvn package[INFO] Scanning for projects...Downlo ...
- 学生会管理系统(SSM)vue+ssm+shiro
数据库 drop database StudentUnionManagementSystem ; create database StudentUnionManagementSystem CHARAC ...
- java连接数据库增删改查公共方法
package dao; import java.io.IOException; import java.sql.CallableStatement; import java.sql.Connecti ...
- sql server 获取存储过程,表值,标量函数的参数
所有的参数都是存在 sys.parameters 这个表中的,我们可以仿造 sql得到表中的列信息 这篇中的sql语句(提示:我们在表值函数中创建的表,最后我们是返回这个表的,我们可以用这个sql语句 ...
- jquery删除当前行
<tr><td><input type='hidden' name='annex' value="+rs+"><a href='javas ...