真正根据utf8编码的规律来进行截取字符串的函数(utf8版sub_str )

代码如下:

/*
* 功能: 作用跟substr一样,除了它不会造成乱码
* 参数:
* 返回:
*/
function utf8_substr( $str , $start , $length=null ){
// 先正常截取一遍.
$res = substr( $str , $start , $length );
$strlen = strlen( $str );
/* 接着判断头尾各6字节是否完整(不残缺) */
// 如果参数start是正数
if ( $start >= 0 ){
// 往前再截取大约6字节
$next_start = $start + $length; // 初始位置
$next_len = $next_start + 6 <= $strlen ? 6 : $strlen - $next_start;
$next_segm = substr( $str , $next_start , $next_len );
// 如果第1字节就不是 完整字符的首字节, 再往后截取大约6字节
$prev_start = $start - 6 > 0 ? $start - 6 : 0;
$prev_segm = substr( $str , $prev_start , $start - $prev_start );
}
// start是负数
else{
// 往前再截取大约6字节
$next_start = $strlen + $start + $length; // 初始位置
$next_len = $next_start + 6 <= $strlen ? 6 : $strlen - $next_start;
$next_segm = substr( $str , $next_start , $next_len );
// 如果第1字节就不是 完整字符的首字节, 再往后截取大约6字节.
$start = $strlen + $start;
$prev_start = $start - 6 > 0 ? $start - 6 : 0;
$prev_segm = substr( $str , $prev_start , $start - $prev_start );
}
// 判断前6字节是否符合utf8规则
if ( preg_match( '@^([\x80-\xBF]{0,5})[\xC0-\xFD]?@' , $next_segm , $bytes ) ){
if ( !empty( $bytes[1] ) ){
$bytes = $bytes[1];
$res .= $bytes;
}
}
// 判断后6字节是否符合utf8规则
$ord0 = ord( $res[0] );
if ( 128 <= $ord0 && 191 >= $ord0 ){
// 往后截取 , 并加在res的前面.
if ( preg_match( '@[\xC0-\xFD][\x80-\xBF]{0,5}$@' , $prev_segm , $bytes ) ){
if ( !empty( $bytes[0] ) ){
$bytes = $bytes[0];
$res = $bytes . $res;
}
}
}
return $res;
}

测试数据::


代码如下:

<?php
$str = 'dfjdjf测13f试65&2数据fdj(1就mfe&……就';
var_dump( utf8_substr( $str , 22 , 12 ) ); echo ' <br /> ';
var_dump( utf8_substr( $str , 22 , -6 ) ); echo ' <br /> ';
var_dump( utf8_substr( $str , 9 , 12 ) ); echo ' <br /> ';
var_dump( utf8_substr( $str , 19 , 12 ) ); echo ' <br /> ';
var_dump( utf8_substr( $str , 28 , -6 ) ); echo ' <br /> ';

显示结果::(截取无乱码, 欢迎大家测试, 提交bug)
string(12) "据fdj"
string(26) "据fdj(1就mfe&…"
string(13) "13f试65&2数"
string(12) "数据fd"
string(20) "dj(1就mfe&…"

(0)

相关推荐

  • utf8编码检测方法分享

    复制代码 代码如下: public bool isUtf8(byte[] rawText)        {            bool result = true; if (rawText == null)            {                return !result;            } int pos = 0;            while (pos < rawText.Length && result)            {     

  • PHP 截取字符串 分别适合GB2312和UTF8编码情况

    1. 截取GB2312中文字符串  复制代码 代码如下: <?php //截取中文字符串 function mysubstr($str, $start, $len) { $tmpstr = ""; $strlen = $start + $len; for($i = 0; $i < $strlen; $i++) { if(ord(substr($str, $i, 1)) > 0xa0) { $tmpstr .= substr($str, $i, 2); $i++; }

  • 基于php导出到Excel或CSV的详解(附utf8、gbk 编码转换)

    php导入到excel乱码是因为utf8编码在xp系统不支持所有utf8编码转码一下就完美解决了utf-8编码案例Php代码 复制代码 代码如下: <?php header("Content-Type: application/vnd.ms-excel; charset=UTF-8"); header("Pragma: public"); header("Expires: 0"); header("Cache-Control: m

  • PHP utf-8编码问题,utf8编码,数据库乱码,页面显示输出乱码

    老声长谈,着是困惑很多人的问题,如果处理不好,都是乱码,说这些话并不是我对编码很精通,只是在这方面是得留神,自己总结了一点小经验(容易出现乱码的地方有php文件里面 ,数据库里面 存储 的编码 ,页面显示 ,数据传输 ): 1.在建数据库的时候,尤其是用phpMyAdmin与MYSQL打交道时候,一般都是utf-8,字段为 utf8_general_ci 数据库的设置: 在my.ini文件中查找:[mysql]default-character-set = utf8[mysqld]default

  • php验证手机号码(支持归属地查询及编码为UTF8)

    复制代码 代码如下: <?php // 手机号验证 function checkMobileValidity($mobilephone){ $exp = "/^13[0-9]{1}[0-9]{8}$|15[012356789]{1}[0-9]{8}$|18[012356789]{1}[0-9]{8}$|14[57]{1}[0-9]$/"; if(preg_match($exp,$mobilephone)){ return true; }else{ return false; }

  • XMLHTTP 乱码的解决方法(UTF8,GB2312 编码 解码)

    在数据发送一方,利用 javascript 的 escape 函数事先将所有中文转换成英文编码并保存(也可以用 ASP 等其它语言的函数实时转换输出). 在数据接收一方,利用 javascript 的 unescape 函数将所有英文编码还原. 由于 Ajax 不论任何编码都能正常传送英文,所以用这种方法可以轻松解决. -------------------------------------------------------------------------------- 用XMLHTTP

  • Oracle将字符编码从GBK转到UTF8,如何操作比较稳妥?

    朋友问: 有个学校oracle数据库的编码是GBK,而且库里边已经有很多生产数据了,现在想改成UTF8的,如果执行了这步操作,会出现哪些问题? 我的回答: 因为utf8的库中文占3个byte,gbk占2个byte,所以会出现客户端乱码. 比较稳妥的方案是,再搭建一个oracle环境,设置成utf8编码,把旧的oracle数据迁移到新的utf8编码的oracle库中的环境. oracle群里面peter的回答: 官方的方法是新建一个utf8的库再导入. 直接改内部视图的办法是错的,从不这样用,也不

  • PHP UTF8编码内的繁简转换类

    曾找过一个JS版的,但是到了UTF8编码里不能用,于是就产生了自已写一个的念头.其实我这个代码的实现原理很简单的,只是一个替换字符集的过程,相信大部份人都可以写得出来.以下是代码,不知道有没有bug,大家如果在使用上有问题,可以提出来 复制代码 代码如下: <?php //<meta charset=utf-8"> class utf8_chinese { private $utf8_gb2312; private $utf8_big5; public function __c

  • JoshChen_web格式编码UTF8-无BOM的小细节分析

    但是在开发的过程中,发现一个小细节的问题,必须要打开F12才能看到的,原来,在head头部里面的所有引用的东西以及title等等,全部都跑到body里面去了,苦思冥想,百度.google全找不到答案.只好放弃了因为他并没有影响到我的功能以及页面上的样式. 而到了今天,在开发别的项目的时候,页面用到了frameset,我想大家应该都明白,frameset只有放在body外面才能使用.然而也是因为这个问题,把head里面的,以及frmaeset的内容全部跑到body里面,而且在body下还有一个空白

  • js 编码转换 gb2312 和 utf8 互转的2种方法

    方法一: 复制代码 代码如下: function gb2utf8(data){       var glbEncode = [];       gb2utf8_data = data;       execScript("gb2utf8_data = MidB(gb2utf8_data, 1)", "VBScript");       var t=escape(gb2utf8_data).replace(/%u/g,"").replace(/(.

  • UTF8编码内的繁简转换的PHP类

    曾找过一个JS版的,但是到了UTF8编码里不能用,于是就产生了自已写一个的念头.其实我这个代码的实现原理很简单的,只是一个替换字符集的过程,相信大部份人都可以写得出来.以下是代码,不知道有没有bug,大家如果在使用上有问题,可以提出来 复制代码 代码如下: <?php //<meta charset=utf-8"> class utf8_chinese { private $utf8_gb2312; private $utf8_big5; public function __c

  • php字符编码转换之gb2312转为utf8

    在php中字符编码转换我们一般会用到iconv与mb_convert_encoding进行操作,但是mb_convert_encoding在转换性能上比iconv要差很多哦.string iconv ( string in_charset, string out_charset, string str ) 注意:第二个参数,除了可以指定要转化到的编码以外,还可以增加两个后缀://TRANSLIT 和 //IGNORE,其中 //TRANSLIT 会自动将不能直接转化的字符变成一个或多个近似的字符

  • PHP截断标题且兼容utf8和gb2312编码

    复制代码 代码如下: <?php if(strlen($r[title])>45){$str=utf8Substr($r[title],0,15)."...";}else{$str=$r[title];}echo $str; ?> //截取utf8字符串 function utf8Substr($str, $from, $len) { return preg_replace('#^(?:[\x00-\x7F]|[\xC0-\xFF][\x80-\xBF]+){0,'.

  • ASP关于编码的几个有用的函数小结(utf8)

    1.'UTF转GB---将UTF8编码文字转换为GB编码文字 复制代码 代码如下: function UTF2GB(UTFStr) for Dig=1 to len(UTFStr) '如果UTF8编码文字以%开头则进行转换 if mid(UTFStr,Dig,1)="%" then 'UTF8编码文字大于8则转换为汉字 if len(UTFStr) >= Dig+8 then GBStr=GBStr & ConvChinese(mid(UTFStr,Dig,9)) Dig

  • 查看修改mysql编码方式让它支持中文(gbk或者utf8)

    MySQL的默认编码是Latin1,不支持中文,要支持中文需要把数据库的默认编码修改为gbk或者utf8. 1.需要以root用户身份登陆才可以查看数据库编码方式(以root用户身份登陆的命令为:>mysql -u root –p,之后两次输入root用户的密码),查看数据库的编码方式命令为: >show variables like 'character%'; +--------------------------+----------------------------+ | Variab

  • 多种语言(big5\gbk\gb2312\utf8\Shift_JIS\iso8859-1)的网页编码切换解决方案归纳

    1.response.setContentType("text/html; charset=GB2312"); 或者response.setContentType("text/html; charset=UTF-8"); charset前面留一个空格 2.头文件包含 3. 一般处理是将在网页上提交的中文转码为Unicode存储在数据库中,取出来的 时候,用自动转码(ContentType="text/html;charset=gb2312"或Co

  • MySql修改数据库编码为UTF8避免造成乱码问题

    mysql 创建数据库时指定编码很重要,很多开发者都使用了默认编码,乱码问题可是防不胜防.制定数据库的编码可以很大程度上避免倒入导出带来的乱码问题. 网页数据一般采用UTF8编码,而数据库默认为latin .我们可以通过修改数据库默认编码方式为UTF8来减少数据库创建时的设置,也能最大限度的避免因粗心造成的乱码问题. 我们遵循的标准是,数据库,表,字段和页面或文本的编码要统一起来 我们可以通过命令查看数据库当前编码: mysql> SHOW VARIABLES LIKE 'character%'

  • Mysql数据库编码问题 (修改数据库,表,字段编码为utf8)

    因为utf8字符集是目前最适合于实现多种不同字符集之间的转换的字符集,尽管你在命令行工具上可能无法正确查看数据库中的内容,我依然强烈建议使用utf8作为默认字符集接下来是完整的一个例子: 1.创建数据库表 mysql>CREATE DATABASE IF NOT EXISTS my_db default charset utf8 COLLATE utf8_general_ci; #注意后面这句话 "COLLATE utf8_general_ci",大致意思是在排序时根据utf8校

随机推荐