PHP截取中文字符串乱码问题(UTF8编码下)

简介:

    前几天,去面试中遇到一个帮毕业就遇到的问题,PHP截取中文字符串乱码问题。究其根本php的字符串截取函数是根据字节来的,而汉字的编码一需要的不单单一个字节,那么自然就会出现乱码问题。

    现在常用的编码格式是UTF8,GBK,GBK2312,BIG5。GBK是GBK2312的升级。现在我开发中遇到的基本都是UTF8,GBK常用在论坛BBS上。今天自己写了下UTF8的,测试下还说的过去,毕竟从网上拷下来的是可以用,但是如果有时间最好还是自己写一下,这样只有到自己手里的才是自己的。

    今天写了UTF8的中文字符截取,不单单是截取从零开始,可以指定位置开始,当然如果是中文那么会中文下一个字符开始,结束是从指定的位置或者指定的汉字结束位置。

函数代码:

 

 
  1. function subUTF8str($str,$start=0,$length=80){ 
  2.     $str_length = strlen($str);//传入字符串的字节长度 
  3.     $end_length = $start + $length//8 //预计结束字节 
  4.     $cut_length = 0; //截取的字节长度 
  5.     $cut_end = $cut_begin = false; //初始化截取状态 
  6.  
  7.     if($start >= $str_length){ //如果字符串开始位置大于字符串总长度 那么返回空 
  8.         return null; 
  9.     } 
  10.     if( ($start == 0) && ($length >= $str_length) ){ //如果起始位置是0 截取长度大于等于总长度 直接返回 
  11.         return $str
  12.     } 
  13.     for($i=0; $i <= $str_length$i++){ 
  14.         if( ($start <= $i) && ($cut_begin === false) ){//如果这一个判断在第二个if后面则取下一个汉字为开头 
  15.             $cut_begin = $i
  16.         } 
  17.         if (ord($str[$i]) > 127){ //如果当前字符的ASCII 值大于127 则是认为是汉字 
  18.             $i += 2; //UTF-8汉字是24位三个字节 如果是汉字那么增加两位 
  19.             $cut_begin?$cut_length += 3:null; 
  20.         }else
  21.             $cut_begin?$cut_length += 1:null; 
  22.         } 
  23.  
  24.         if( ($end_length <= $i) && ($cut_end === false) ){ 
  25.             break
  26.         } 
  27.     } 
  28.  
  29.     return substr($str$cut_begin , $cut_length ); 

整体测试代码

 
  1. header("Content-type:text/html;charset=UTF-8"); 
  2. set_time_limit(0); 
  3. $str = ''
  4. for($i=0;$i<1000;$i++){ 
  5.     $str .='这里是截cefaACC截$%^&*截()_((截^&*^截*&%截%'
  6.  
  7. function subUTF8str($str,$start=0,$length=80){ 
  8.     $str_length = strlen($str);//传入字符串的字节长度 
  9.     $end_length = $start + $length//8 //预计结束字节 
  10.     $cut_length = 0; //截取的字节长度 
  11.     $cut_end = $cut_begin = false; //初始化截取状态 
  12.  
  13.     if($start >= $str_length){ //如果字符串开始位置大于字符串总长度 那么返回空 
  14.         return null; 
  15.     } 
  16.     if( ($start == 0) && ($length >= $str_length) ){ //如果起始位置是0 截取长度大于等于总长度 直接返回 
  17.         return $str
  18.     } 
  19.     for($i=0; $i <= $str_length$i++){ 
  20.         if( ($start <= $i) && ($cut_begin === false) ){//如果这一个判断在第二个if后面则取下一个汉字为开头 
  21.             $cut_begin = $i
  22.         } 
  23.         if (ord($str[$i]) > 127){ //如果当前字符的ASCII 值大于127 则是认为是汉字 
  24.             $i += 2; //UTF-8汉字是24位三个字节 如果是汉字那么增加两位 
  25.             $cut_begin?$cut_length += 3:null; 
  26.         }else
  27.             $cut_begin?$cut_length += 1:null; 
  28.         } 
  29.  
  30.         if( ($end_length <= $i) && ($cut_end === false) ){ 
  31.             break
  32.         } 
  33.     } 
  34.  
  35.     return substr($str$cut_begin , $cut_length ); 
  36. echo time().'<br/>'
  37. for($i=0;$i<1000;$i++){ 
  38.     $begin = rand(1,100); 
  39.     $length = rand(1,1000); 
  40.     echo subUTF8str($str,$begin,$length)."\n"
  41. echo time().'<br/>'

下次有机会写其他编码格式的





    本文转自kefirking 51CTO博客,原文链接:,http://blog.51cto.com/phpzf/794660如需转载请自行联系原作者


相关文章
|
2月前
|
PHP
在PHP中,字符串操作
在PHP中,字符串操作
29 3
|
2月前
|
PHP
06 一文带你搞定PHP字符串操作
路老师带你深入PHP:本文详细介绍了PHP中的字符串定义、操作及常用函数,包括字符串的定义方式、定界符、字符串操作(如去除空格、获取长度、截取、替换、分割和合成等)。通过实例讲解,帮助你快速掌握PHP字符串处理技巧。
30 2
|
2月前
|
JSON 缓存 前端开发
PHP如何高效地处理JSON数据:从编码到解码
在现代Web开发中,JSON已成为数据交换的标准格式。本文探讨了PHP如何高效处理JSON数据,包括编码和解码的过程。通过简化数据结构、使用优化选项、缓存机制及合理设置解码参数等方法,可以显著提升JSON处理的性能,确保系统快速稳定运行。
|
3月前
|
设计模式 SQL 安全
PHP中的设计模式:单例模式的深入探索与实践在PHP开发领域,设计模式是解决常见问题的高效方案集合。它们不是具体的代码,而是一种编码和设计经验的总结。单例模式作为设计模式中的一种,确保了一个类仅有一个实例,并提供一个全局访问点。本文将深入探讨单例模式的基本概念、实现方式及其在PHP中的应用。
单例模式在PHP中的应用广泛,尤其在处理数据库连接、日志记录等场景时,能显著提高资源利用率和执行效率。本文从单例模式的定义出发,详细解释了其在PHP中的不同实现方法,并探讨了使用单例模式的优势与注意事项。通过对示例代码的分析,读者将能够理解如何在PHP项目中有效应用单例模式。
|
4月前
|
XML SQL PHP
php学习笔记-php字符串及字符串常用函数总结-day04
本文总结了PHP中字符串的三种定义方式和常用字符串处理函数,包括字符串的修剪、转换、长度计算、子串操作、比较、连接、分割及替换等操作。
|
5月前
|
Java PHP 开发者
PHP中的异常处理:Java常见的编码方式
在PHP开发中,掌握异常处理至关重要,它有助于预见并管理运行时错误,避免用户体验受损或数据丢失。本文介绍PHP异常处理的基本概念与实践,包括try-catch语句的使用,以及如何通过抛出和捕获异常来增强代码的健壮性和可靠性。通过示例展示如何避免常见错误,如除数为零的情况,并探讨多catch块和finally语句的高级用法,帮助开发者提升程序稳定性与可维护性。[总字符数:238]
35 0
|
6月前
|
存储 PHP 索引
|
7月前
|
PHP
php删除字符串中的所有空格
php删除字符串中的所有空格
37 0
|
7月前
|
运维 Serverless API
Serverless 应用引擎产品使用合集之如何使用PHP SDK调用函数并在请求体(body)中传递字符串
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。
|
8月前
|
安全 PHP
PHP反序列化---字符串逃逸(增加/减少)
PHP反序列化---字符串逃逸(增加/减少)