PHP substr 截取字符串出现乱码问题解决方法[utf8与gb2312]

 更新时间:2011年12月16日 15:20:20   作者:  
在PHP中,使substr函数截取字符串末位会出现乱码,因为中文UTF-8编码,每个汉字占3字节,而GB2312占2字节,英文占1字节,截取位不准确,造成断开的字符会把其后的..拉过来一起做一个字,所以出现了乱码。
substr --- 取得部份字符串
语法 : string substr (string string, int start [, int length])
说明 :
substr( )传回 string的一部份字符串,由参数 start和 length指定。
如果 start是正数,传回的字符串将会从 string的第 start个字元开始。
Example :
复制代码 代码如下:

<?php
$rest = substr ("abcdef", 1); // returns "bcdef"
$rest = substr ("abcdef", 1, 3); // returns "bcd"
?>

如果 start是负数,传回的字符串将会从 string结尾的第 start个字开始。
Example :
复制代码 代码如下:

<?php
$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个字元。
Example :
复制代码 代码如下:

<?php
$rest = substr ("abcdef", 1, -1); // returns "bcde"
?>

dongyue,2005-01-07 11:10:41
substr --- 取得部份字符串
语法 : string substr (string string, int start [, int length])
说明 :
substr( )传回 string的一部份字符串,由参数 start和 length指定。
如果 start是正数,传回的字符串将会从 string的第 start个字元开始。
Example :
复制代码 代码如下:

<?php
$rest = substr ("abcdef", 1); // returns "bcdef"
$rest = substr ("abcdef", 1, 3); // returns "bcd"
?>

如果 start是负数,传回的字符串将会从 string结尾的第 start个字开始。
Example :
复制代码 代码如下:

<?php
$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个字元。
Example :
复制代码 代码如下:

<?php
$rest = substr ("abcdef", 1, -1); // returns "bcde"
?>

Utf-8、gb2312都支持的汉字截取函数
复制代码 代码如下:

//截取中文字符串
/*
Utf-8、gb2312都支持的汉字截取函数
cut_str(字符串, 截取长度, 开始长度, 编码);
编码默认为 utf-8
开始长度默认为 0
*/function cut_str($string, $sublen, $start = 0, $code = 'UTF-8')
{
if($code == 'UTF-8')
{
$pa ="/[\x01-\x7f]|[\xc2-\xdf][\x80-\xbf]|\xe0[\xa0-\xbf][\x80-\xbf]|[\xe1-\xef][\x80-\xbf][\x80-\xbf]|\xf0[\x90-\xbf][\x80-\xbf][\x80-\xbf]|[\xf1-\xf7][\x80-\xbf][\x80-\xbf][\x80-\xbf]/";
preg_match_all($pa, $string, $t_string); if(count($t_string[0]) - $start > $sublen) return join('', array_slice($t_string[0], $start, $sublen));
return join('', array_slice($t_string[0], $start, $sublen));
}
else
{
$start = $start*2;
$sublen = $sublen*2;
$strlen = strlen($string);
$tmpstr = ''; for($i=0; $i<$strlen; $i++)
{
if($i>=$start && $i<($start+$sublen))
{
if(ord(substr($string, $i, 1))>129)
{
$tmpstr.= substr($string, $i, 2);
}
else
{
$tmpstr.= substr($string, $i, 1);
}
}
if(ord(substr($string, $i, 1))>129) $i++;
}
if(strlen($tmpstr)<$strlen ) $tmpstr.= "";
return $tmpstr;
}
}
$str="脚本之家一个不错的网站";
echo cut_str($str, 8, 5, 'gb2312');

相关文章

  • PHP+jquery实时显示网站在线人数的方法

    PHP+jquery实时显示网站在线人数的方法

    这篇文章主要介绍了PHP+jquery实时显示网站在线人数的方法,较为详细的分析了实时显示在线人数的原理与代码实现技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-01-01
  • php编译安装php-amq扩展简明教程

    php编译安装php-amq扩展简明教程

    这篇文章主要介绍了php编译安装php-amq扩展的方法,较为详细的分析了php-amq扩展的功能及下载、编译安装的具体步骤与相关注意事项,需要的朋友可以参考下
    2016-06-06
  • PHP 采集心得技巧

    PHP 采集心得技巧

    今天给大家共享一下我的采集代码! 思路: 采集程序的思路很简单大体可以分为以下几个步骤
    2009-05-05
  • PHP中curl_setopt函数用法实例分析

    PHP中curl_setopt函数用法实例分析

    这篇文章主要介绍了PHP中curl_setopt函数用法,以实例形式分析了curl_setopt函数的功能、定义、用途及相关的使用技巧,非常具有实用价值,需要的朋友可以参考下
    2015-04-04
  • 数组与类使用PHP的可变变量名需要的注意的问题

    数组与类使用PHP的可变变量名需要的注意的问题

    本篇文章是对数组与类使用PHP的可变变量名需要的注意的问题进行了详细的分析介绍,需要的朋友参考下
    2013-06-06
  • PHP中余数、取余的妙用

    PHP中余数、取余的妙用

    这篇文章主要介绍了PHP中余数、取余的妙用,这个是在WEB开发中一个经常使用的小技巧,不管是在表格、ul、li或者是换行等HTML处理中,需要隔几行换行,隔几行加入ul或li的结束标记等时候,特别的有用,需要的朋友可以参考下
    2015-06-06
  • PHP调用MySQL的存储过程的实现代码

    PHP调用MySQL的存储过程的实现代码

    MySQL好像从5.0开始才引入存储过程,反正以前做应用的时候从没碰过,不过现在因为主要作内部系统
    2008-08-08
  • require(),include(),require_once()和include_once()区别

    require(),include(),require_once()和include_once()区别

    面试中最容易提到的一个PHP的问题,我想和大家共勉一下: require()和include()有许多相似之处,也有些不同。理解它们的不同点非常重要,否则很容易犯错误。
    2008-03-03
  • 分享下php5类中三种数据类型的区别

    分享下php5类中三种数据类型的区别

    这篇文章主要介绍了php5类中三种数据类型的区别,需要的朋友可以参考下
    2015-01-01
  • 详解PHP设计模式之桥接模式

    详解PHP设计模式之桥接模式

    桥接,顾名思义,就是用来连接两个部分,使得两个部分可以互相通讯。桥接模式将系统的抽象部分与实现部分分离解耦,使他们可以独立的变化。本文通过示例详细介绍了桥接模式的原理与使用,需要的可以参考一下
    2022-12-12

最新评论