php字符串无乱码截取函数封装
- /**
- *
- * 中英混合字符串长度判断
- * @param unknown_type $str
- * @param unknown_type $charset
- */
- function strLength($str, $charset = 'utf-8')
- {
- if ($charset == 'utf-8'){
- $str = iconv('utf-8', 'gb2312', $str);
- }
- $num = strlen($str);
- $cnNum = 0;
- for ($i = 0; $i < $num; $i++) {
- if (ord(substr($str, $i + 1, 1)) > 127) {
- $cnNum++;
- $i++;
- }
- }
- $enNum = $num - ($cnNum * 2);
- $number = ($enNum / 2) + $cnNum;
- return ceil($number);
- }
- /**
- *
- * 中英混合的字符串截取
- * @param unknown_type $sourcestr
- * @param unknown_type $cutlength
- */
- function cut_str($sourcestr, $cutlength)
- {
- $returnstr = '';
- $i = 0;
- $n = 0;
- $str_length = strlen($sourcestr); //字符串的字节数
- while (($n < $cutlength) and ($i <= $str_length)) {
- $temp_str = substr($sourcestr, $i, 1);
- $ascnum = Ord($temp_str); //得到字符串中第$i位字符的ascii码
- if ($ascnum >= 224) //如果ASCII位高与224,
- {
- $returnstr = $returnstr . substr($sourcestr, $i, 3); //根据UTF-8编码规范,将3个连续的字符计为单个字符
- $i = $i + 3; //实际Byte计为3
- $n++; //字串长度计1
- } elseif ($ascnum >= 192) //如果ASCII位高与192,
- {
- $returnstr = $returnstr . substr($sourcestr, $i, 2); //根据UTF-8编码规范,将2个连续的字符计为单个字符
- $i = $i + 2; //实际Byte计为2
- $n++; //字串长度计1
- } elseif ($ascnum >= 65 && $ascnum <= 90) //如果是大写字母,
- {
- $returnstr = $returnstr . substr($sourcestr, $i, 1);
- $i = $i + 1; //实际的Byte数仍计1个
- $n++; //但考虑整体美观,大写字母计成一个高位字符
- } else //其他情况下,包括小写字母和半角标点符号,
- {
- $returnstr = $returnstr . substr($sourcestr, $i, 1);
- $i = $i + 1; //实际的Byte数计1个
- $n = $n + 0.5; //小写字母和半角标点等与半个高位字符宽...
- }
- }
- if ($str_length > $cutlength) {
- $returnstr = $returnstr . "..."; //超过长度时在尾处加上省略号
- }
- return $returnstr;
- }
- /**
- * PHP实现中文字串截取无乱码的方法
- * @param $string
- * @param $start
- * @param $length
- * @return string
- */
- function GBsubstr($string, $start, $length)
- {
- if (strlen($string) > $length) {
- $str = null;
- $len = $start + $length;
- for ($i = $start; $i < $len; $i++) {
- if (ord(substr($string, $i, 1)) > 0xa0) {
- $str .= substr($string, $i, 2);
- $i++;
- } else {
- $str .= substr($string, $i, 1);
- }
- }
- return $str . '...';
- } else {
- return $string;
- }
- }
- function substr_text($str, $start = 0, $length, $charset = "utf-8", $suffix = "")
- {
- if (function_exists("mb_substr")) {
- return mb_substr($str, $start, $length, $charset) . $suffix;
- } elseif (function_exists('iconv_substr')) {
- return iconv_substr($str, $start, $length, $charset) . $suffix;
- }
- $re['utf-8'] = "/[\x01-\x7f]|[\xc2-\xdf][\x80-\xbf]|[\xe0-\xef][\x80-\xbf]{2}|[\xf0-\xff][\x80-\xbf]{3}/";
- $re['gb2312'] = "/[\x01-\x7f]|[\xb0-\xf7][\xa0-\xfe]/";
- $re['gbk'] = "/[\x01-\x7f]|[\x81-\xfe][\x40-\xfe]/";
- $re['big5'] = "/[\x01-\x7f]|[\x81-\xfe]([\x40-\x7e]|\xa1-\xfe])/";
- preg_match_all($re[$charset], $str, $match);
- $slice = join("", array_slice($match[0], $start, $length));
- return $slice . $suffix;
- }
php字符串无乱码截取函数封装的更多相关文章
- php实现中文字符串无乱码截取
在PHP开发中会经常用到字符串截取,有的时候字符串截取会出现乱码的情况,那么怎么解决这个问题呢,其实也很容易 首先我们要了解关于中英文占多少字节的问题. ASCII码:一个中文汉字占两个字节的空间. ...
- PHP中文无乱码截取
正在上传文件反正无聊 就把php无乱码截取写出来吧` 参数说明 gbk 字符编码中,存储中文字符要2个字节 uft-8 字符编码中,存储中文字符要3个字节 0xa0 半个汉字 ord()— ...
- php截取中文字符串无乱码的方法
利用php内置方法mb_substr截取中文不乱码,使用起来非常简单 <?php $str = '我喜欢laravel or yii2'; echo mb_substr($str, 0, 1, ...
- js截取中英文字符串、标点符号无乱码示例解读
<script> function subString(str, len, hasDot) { var newLength = 0; var newStr = ""; ...
- PHP截取中文无乱码函数——cutstr
转载:http://blog.sina.com.cn/s/blog_694c144f010179wj.html 真正好用的PHP截取中文无乱码函数——cutstr (2012-07-09 11:17: ...
- PHP实现中文字符串截取无乱码
在我们学习PHP知识的过程中,PHP截取字符串应该是一个非常常见的字符串基础操作了,想必大家都比较熟悉这方面知识点. 但是有些新手朋友们可能遇到过,当截取中英文字符串时出现乱码的情况,其实这个也是非常 ...
- php截取字符串,无乱码
今天面试,有一道题,要求截取中文字符无乱码. 当时因为要赶去另一家去面试,没有仔细分析. 虽然现在供职的这家公司b2c项目正在用,因为当时赶项目,是网上拿来直接用的. 回来以后再重新整理了一下. 代码 ...
- php中文截取无乱码方法
直接使用PHP函数substr截取中文字符可能会出现乱码,主要是substr可能硬生生的将一个中文字符“锯”成两半.解决办法: 1.使用mbstring扩展库的mb_substr截取就不会出现乱码了. ...
- PHP实现中文字串截取无乱码的方法
直接使用PHP函数substr截取中文字符可能会出现乱码,主要是substr可能硬生生的将一个中文字符“锯”成两半.解决办法: 1.使用mbstring扩展库的mb_substr截取就不会出现乱码了. ...
随机推荐
- ojdbc.jar
Oracle的jdbc驱动是ojdbc.jar 文件,那么mysql的jdbc驱动是什么呢? 匿名 | 浏览 689 次 发布于2015-06-07 02:06 最佳答案 MySQL的JDBC ...
- Node & Express: some tips
1. 设置Express端口号: 在app.js中添加 app.set('port', process.env.PORT || 3000); 之后命令行中打入 PORT=1234 node app.j ...
- 开源的轻量级JSON存储Kinto介绍
本文来源于我在InfoQ中文站翻译的文章,原文地址是:http://www.infoq.com/cn/news/2015/12/introducing-kinto Kinto是个提供了同步与分片功能的 ...
- [JavaEE] Implement a test for REST endpoint
1. We have the BookEndpoint.java: package com.pluralsight.bookstore.rest; import com.pluralsight.boo ...
- Java入门 第二季第三章 继承
这是我学习慕课网Java课程的笔记,原视频链接为:http://www.imooc.com/learn/124 3-1 Java 中的继承 ★ 概念:继承是类与类的一种关系,是一种 "is ...
- LeetCode 977. Squares of a Sorted Array (有序数组的平方)
题目标签:Array 题目给了我们一组 从小到大的 integers,让我们平方数字 并且 也排序成 从小到达. 因为有负数在里面,平方后,负数在array的位置会变动. 可以设left 和 righ ...
- svn 运行clear up 失败的解决的方法
SVN 的clear up命令失败的解决方法 1. 下载 sqlite3.exe 文件,放到d盘根文件夹. (能够到这里下载 http://download.csdn.net/detail ...
- eclipse和jdk版本对应问题
日常开发中,32位eclipse要用32位jdk,64位则必须要用64位jdk,否则启动时就会报错,load jvm.dll失败,昨天又遇到了这个问题.更换对应的版本之后就好了.tomcat等应用也有 ...
- 编译android4.4 报错error: call to '__property_get_too_small_error' declared with attribute 的处理 (转载)
转自:http://blog.csdn.net/syhost/article/details/14448899 完整的报错为: system/core/include/cutils/propertie ...
- redhat6 改 centos yum 源
**redhat的yum在线更新是收费的,如果没有注册的话不能使用,如果要使用,需将redhat的yum卸载后,重启安装其他yum源,再配置其他源.** 本文包括配置本地源及第三方源.第三方源包括:网 ...