gbk与utf-8字符串无乱码截取

简介:

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,如需转载请自行联系原作者


相关文章
|
6天前
|
存储 自然语言处理 程序员
字符串编码(ASCII, GBK, ANSI, Unicode(‘\u‘), UTF-8编码)(转载)
本文介绍了字符串编码的发展历程,从ASCII、GB2312到Unicode和UTF-8,详细解释了各种编码的特点和应用场景,重点阐述了解决多语言乱码问题的演变过程。
71 54
|
5月前
|
Java
Java系列之:字符串UTF-8 编码格式转换位 UTF-32 【生僻字截取问题】
这篇文章讨论了在Java中处理包含生僻字的字符串时可能遇到的问题,并提供了一种解决方法:将字符串的编码格式从UTF-8转换为UTF-32,以确保每个字符都占用固定的字节数,从而避免在截取操作中破坏字符,示例代码展示了如何进行编码转换和字符串截取。
|
7月前
将文字或txt转换成GBK或者UTF8编码
将文字或txt转换成GBK或者UTF8编码
493 1
|
存储 Java 关系型数据库
【精炼易懂】字符集、编码、乱码问题、ASCII、GBK、Unicode、UTF-8详解+实例说明
【精炼易懂】字符集、编码、乱码问题、ASCII、GBK、Unicode、UTF-8详解+实例说明
6177 4
|
存储 Windows
“浅入深处“编码历史,字符串编码(ASCII, GBK, ANSI, Unicode, UTF-8编码),为什么记事本默认ANSI编码,Unicode和UTF8有什么区别
“浅入深处“编码历史,字符串编码(ASCII, GBK, ANSI, Unicode, UTF-8编码),为什么记事本默认ANSI编码,Unicode和UTF8有什么区别
155 0
|
存储 编解码 前端开发
正确的认识乱码与编码
编码将《内存字节》作用于《磁盘文件或者网络文件》的过程,也是将《磁盘文件/网络文件》反解析成《内存字节》的过程. 这个过程中如果 内存字符串到 “字节数组”的编码 与 网络/磁盘文件的之间转化的编解码方式不一致或者不兼容就 会产生乱码. 在一次网络数据访问的过程中,可能有多次这两个步骤的转化.
174 0
C++ 过滤出字符串的中文(GBK,UTF-8)
C++ 过滤出字符串的中文(GBK,UTF-8)最近在处理游戏敏感词之类的东西,为了加强屏蔽处理,所以需要过滤掉字符串中的除汉字之外的是其他东西如数字,符号,英文字母等。 首先我查阅资料并写了个函数: 示例:返回输入字符串中汉字的个数: 复制代码std::string StrWithOutSymb...
4759 0
|
存储 算法 Java
Java编码ASCII、GB2312、GBK、Unicode、UTF-8、UTF-16 编码方式详解
Java编码ASCII、GB2312、GBK、Unicode、UTF-8、UTF-16 编码方式详解
421 0
|
存储 安全 关系型数据库
为什么编码不同会出现乱码?
本章节通过情景模拟,和大家一起探讨为什么编码不同会出现乱码
|
Web App开发 JavaScript Java
编码问题 UTF-8 & GBK
记一次奇怪的编码问题。 * Meta Element vs Response Header * Meta 的作用? * 一个细节 * 细节对编码的影响 ## Meta Element vs Response Header 一个 GBK 编码页面,使用 meta 指定页面编码和使用 response header 指定页面编码。哪个优先级比较高? ###
2413 0