当前位置:  编程技术>php
本页文章导读:
    ▪php截取中文的函数utf_substr      类似这样的替换操作,用到了php函数preg_replace:   代码示例: $tmp = preg_replace('/[一-龥]/u','<@>','你好我是谁?123abc'); /u是UTF-8 代码1,PHP截取UTF-8字符串,解决半字符问题   代码示例: <?.........
    ▪php substr截断中文半个汉字乱码问题的解决方法      在php中,多使用substr函数截取字符串,但有时会出现半个汉字乱码的问题,此时可以使用mb_substr()函数安全的截取。 substr函数 string substr ( string $string , int $start [, int $length ] ) 返回string中从sta.........
    ▪php中iconv函数的bug问题      在php中,使用iconv函数转换字符集很好用,不过有时iconv转换会返回false或空字符串,这不算是iconv的问题,这其实是字符集的问题,但是实际编码中应该算是iconv的bug了。 测试下这段字符串用i.........

[1]php截取中文的函数utf_substr
    来源: 互联网  发布时间: 2013-12-24

类似这样的替换操作,用到了php函数preg_replace:
 

代码示例:
$tmp = preg_replace('/[一-龥]/u','<@>','你好我是谁?123abc');
/u是UTF-8

代码1,PHP截取UTF-8字符串,解决半字符问题
 

代码示例:

<?php
/***
* PHP截取UTF-8字符串,解决半字符问题。utf_substr
* 英文、数字(半角)为1字节(8位),中文(全角)为3字节
* @return 取出的字符串, 当$len小于等于0时, 会返回整个字符串
* @param $str 源字符串
* $len 左边的子串的长度
* @edit www.
function utf_substr($str,$len){
for($i=0;$i<$len;$i++){
   $temp_str=substr($str,0,1);
   if(ord($temp_str) > 127){
    $i++;
    if($i<$len){
     $new_str[]=substr($str,0,3);
     $str=substr($str,3);
    }
   }else{
    $new_str[]=substr($str,0,1);
   $str=substr($str,1);
   }
}
return join($new_str);
}

//调用示例
$str = utf_substr('你好',4);
echo $str;
?>

代码2,截取utf-8字符串函数
 

代码示例:

<?php
/**
* 截取utf-8字符串
* edit www.
*/
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;
}

//调用示例
$str = '你好!我好';
$str = cut_str($str,3);
echo $str;
?>


    
[2]php substr截断中文半个汉字乱码问题的解决方法
    来源: 互联网  发布时间: 2013-12-24

在php中,多使用substr函数截取字符串,但有时会出现半个汉字乱码的问题,此时可以使用mb_substr()函数安全的截取。

substr函数
string substr ( string $string , int $start [, int $length ] )
返回string中从start位置开始长度为length的字符串

substr函数在截取字符时是按字节来截取的,中文字符在GB2312编码时为2个字节,utf-8编码时为3个字节,所以截取指定长度的字符串时如果截断了汉字,那么返回的结果显示出来便会出现乱码。

解决办法:
1、改用mb_substr()函数
string mb_substr ( string $str , int $start [, int $length [, string $encoding ]] )
类似substr()函数,只是计数按字符数来计,保证字符安全
使用mb_substr()函数可保证不会出现乱码,但缺点是长度统计变成了字符数统计,而不是按字节数统计。用于显示时,同样长度的中文结果和英文结果会出现较大的显示长度的差别。

2、来自康盛的substr功能
中文字符按2个长度单位来计算,使得中英文混用环境下字符串截取结果最后的显示长度接近;
舍弃最后一个不完整字符,保证不会出现显示上的乱码;
且兼容了中文字符常用的utf-8编码和GB2312编码,有很好的通用性。

代码如下:
 

代码示例:
<?php
/**
* 改进的substr
* edit www.
*/
function getstr($string, $length, $encoding  = 'utf-8') {  
$string = trim($string);  
    if($length && strlen($string) > $length) {  
            //截断字符  
            $wordscut = '';  
            if(strtolower()($encoding) == 'utf-8') {  
                //utf8编码  
                $n = 0;  
                $tn = 0;  
                $noc = 0;  
                while ($n < strlen($string)) {  
                    $t = ord($string[$n]);  
                    if($t == 9 || $t == 10 || (32 <= $t && $t <= 126)) {  
                        $tn = 1;  
                        $n++;  
                        $noc++;  
                    } elseif(194 <= $t && $t <= 223) {  
                        $tn = 2;  
                        $n += 2;  
                        $noc += 2;  
                    } elseif(224 <= $t && $t < 239) {  
                        $tn = 3;  
                        $n += 3;  
                        $noc += 2;  
                    } elseif(240 <= $t && $t <= 247) {  
                        $tn = 4;  
                        $n += 4;  
                        $noc += 2;  
                    } elseif(248 <= $t && $t <= 251) {  
                        $tn = 5;  
                        $n += 5;  
                        $noc += 2;  
                    } elseif($t == 252 || $t == 253) {  
                        $tn = 6;  
                        $n += 6;  
                        $noc += 2;  
                    } else {  
                        $n++;  
                    }  
                    if ($noc >= $length) {  
                        break;  
                    }  
                }  
                if ($noc > $length) {  
                    $n -= $tn;  
                }  
                $wordscut = substr($string, 0, $n);  
            } else {  
                for($i = 0; $i < $length - 1; $i++) {  
                    if(ord($string[$i]) > 127) {  
                        $wordscut .= $string[$i].$string[$i + 1];  
                        $i++;  
                    } else {  
                        $wordscut .= $string[$i];  
                    }  
                }  
            }  
            $string = $wordscut;  
        }  
        return trim($string);  
    }
  ?>

您可能感兴趣的文章:
php函数substr截取中文字符出现乱码的解决方法
php乱码问题 utf8乱码杂谈
php截取中文字符串乱码如何解决呢
php分割GBK中文乱码的解决方法
解决php截取utf-8中文字符串时乱码的问题
如何解决php中文字符乱码,中文字符入库乱码的问题
php中文字符串截断且无乱码的解决方法
有关php中文乱码的解决方法
php utf8 一半乱码的问题


    
[3]php中iconv函数的bug问题
    来源: 互联网  发布时间: 2013-12-24

在php中,使用iconv函数转换字符集很好用,不过有时iconv转换会返回false或空字符串,这不算是iconv的问题,这其实是字符集的问题,但是实际编码中应该算是iconv的bug了。

测试下这段字符串用iconv转换后的效果:
 

代码示例:
 $str="www.,ok!the string is € .我要转换他!⊙●○①⊕◎Θ⊙¤㊣";
 echo '没有任何参数 : ', iconv("utf-8", "gbk", $str)."<br>";

返回结果:
第一个特殊字符以后的字符都不能显示。

iconv有两个参数:
分别是TRANSLIT 和IGNORE ,含义是TRANSLIT 表示如果目标编码里面不能翻译原编码,那么就直接找一个类似的最相近的字符或者字符串替代,例如€可能会被替换为EUR;而IGNORE   遇到目标字符集不能翻译的原始字符则直接跳过忽略,不返回false。

使用方法:
 

代码示例:
$infocontent=iconv("utf-8","gbk//IGNORE",$infocontent);

$infocontent=iconv("utf-8","gbk//TRANSLIT",$infocontent);

鉴于此,我认为iconv应该提供一个默认的参数IGNORE,避免开发者使用不善时出现返回空字符串的情况。


    
最新技术文章:
▪PHP函数microtime()时间戳的定义与用法
▪PHP单一入口之apache配置内容
▪PHP数组排序方法总结(收藏)
▪php数组排序方法大全(脚本学堂整理奉献)
▪php数组排序的几个函数(附实例)
▪php二维数组排序(实例)
▪php根据键值对二维数组排序的小例子
▪php验证码(附截图)
▪php数组长度的获取方法(三个实例)
▪php获取数组长度的方法举例
▪判断php数组维度(php数组长度)的方法
▪php获取图片的exif信息的示例代码
▪PHP 数组key长度对性能的影响实例分析
▪php函数指定默认值的方法示例
▪php提交表单到当前页面、提交表单后页面重定...
▪php四舍五入的三种实现方法
▪php获得数组长度(元素个数)的方法
▪php日期函数的简单示例代码
▪php数学函数的简单示例代码
▪php字符串函数的简单示例代码
▪php文件下载代码(多浏览器兼容、支持中文文...
▪php实现文件下载、支持中文文件名的示例代码...
▪php文件下载(防止中文文件名乱码)的示例代码
▪解决PHP文件下载时中文文件名乱码的问题
▪php数组去重(一维、二维数组去重)的简单示例
▪php小数点后取两位的三种实现方法
▪php Redis 队列服务的简单示例
▪PHP导出excel时数字变为科学计数的解决方法
▪PHP数组根据值获取Key的简单示例
▪php数组去重的函数代码示例
 


站内导航:


特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,,E-mail:www_#163.com(请将#改为@)

浙ICP备11055608号-3