博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
gbk与utf-8字符串无乱码截取
阅读量:7107 次
发布时间:2019-06-28

本文共 1796 字,大约阅读时间需要 5 分钟。

GBK:

 
  1. <?php

  2. function mysubstr($str$start$len) {

  3. $tmpstr = "";

  4. $strlen = $start + $len;

  5. for($i = 0; $i < $strlen$i++) {

  6. if(ord(substr($str$i, 1)) > 0xa0) {

  7. $tmpstr .= substr($str$i, 2);

  8. $i++;

  9.        } else

  10. $tmpstr .= substr($str$i, 1);

  11.    }

  12. return$tmpstr;

  13. }

  14. ?>

今天发现(2014-02-11)上面方法不靠谱,还是出现了乱码,用下面这个就可以了:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
function 
sysSubStr(
$String
,
$Length
,
$Append 
= false) 
if 
(
strlen
(
$String
) <= 
$Length 
return 
$String
else
$I 
= 0; 
while 
(
$I 
$Length
$StringTMP 
substr
(
$String
,
$I
,1); 
if 
( ord(
$StringTMP
) >=224 ) 
$StringTMP 
substr
(
$String
,
$I
,3); 
$I 
$I 
+ 3; 
elseif
( ord(
$StringTMP
) >=192 ) 
$StringTMP 
substr
(
$String
,
$I
,2); 
$I 
$I 
+ 2; 
else
$I 
$I 
+ 1; 
$StringLast
[] = 
$StringTMP
$StringLast 
= implode(
""
,
$StringLast
); 
if
(
$Append
$StringLast 
.= 
"..."
return 
$StringLast
}


UTF-8:

 
  1. <?php

  2. function utfSubstr($str$position$length,$type=1){

  3. $startPos = strlen($str);

  4. $startByte = 0;

  5. $endPos = strlen($str);

  6. $count = 0;

  7. for($i=0; $i<strlen($str); $i++){

  8. if($count>=$position && $startPos>$i){

  9. $startPos = $i;

  10. $startByte = $count;

  11.   }

  12. if(($count-$startByte) >= $length) {

  13. $endPos = $i;

  14. break;

  15.   }

  16. $value = ord($str[$i]);

  17. if($value > 127){

  18. $count++;

  19. if($value>=192 && $value<=223) $i++;

  20. elseif($value>=224 && $value<=239) $i = $i + 2;

  21. elseif($value>=240 && $value<=247) $i = $i + 3;

  22. elsereturn self::raiseError("\"$str\" Not a UTF-8 compatible string", 0, __CLASS____METHOD____FILE____LINE__);

  23.   }

  24. $count++;

  25.  }

  26. if($type==1 && ($endPos-6)>$length){

  27. returnsubstr($str$startPos$endPos-$startPos);

  28.  }

  29. else{

  30. returnsubstr($str$startPos$endPos-$startPos);      

  31.  }

  32. }

  33. ?>

      本文转自许琴 51CTO博客,原文链接:http://blog.51cto.com/xuqin/882328,如需转载请自行联系原作者
你可能感兴趣的文章
【hadoop】15.HDFS-其他功能
查看>>
照葫芦画瓢-reading files(读文件)
查看>>
HTTP协议详解(转)
查看>>
Android零基础入门第54节:视图切换组件ViewSwitcher
查看>>
083-使用shell和expect一键批量分发SSH密钥脚本
查看>>
线上采购注意了
查看>>
压缩与打包
查看>>
0037-如何在Windows Server2008搭建DNS服务并配置泛域名解析
查看>>
.net core入门之HelloWorld
查看>>
OSChina 周六乱弹 ——给媳妇打电话,一个男人的声音……
查看>>
OSChina 周一乱弹 —— 鱼生不值得
查看>>
jodd mvc框架 madvoc 教程(12):madvoc 杂项
查看>>
ffmpeg转码不同分辨率视频
查看>>
Oracle:查找表的主键,外键,唯一性约束,索引
查看>>
Python学习笔记-模块介绍(二)-模块导入和执行
查看>>
Cocos数据篇[3.4](6) ——SQLite3数据库基础用法
查看>>
Linux应用总结(1):自动删除n天前日志
查看>>
跟我学习dubbo-简介(1)
查看>>
Rsync基本操作加实时同步演练
查看>>
第1章 选择流程控制语句
查看>>