佳音的博客

2007/08/07

PHP中GBK和UTF8编码处理[http://www.fulin.org/blog/2007/05/29/php-utf8-gbk/]

Filed under: Uncategorized — 佳音 @ 10:41 上午

当我用java 解析带有特殊字符(同事称为 简体繁体 脑残体)(比如说\z)的时候就会保存
在网上看到这篇文章 记录下来 用做过滤非显示字符

一、编码范围1. GBK (GB2312/GB18030)
\x00-\xff GBK双字节编码范围
\x20-\x7f ASCII
\xa1-\xff 中文
\x80-\xff 中文

2. UTF-8 (Unicode)
\u4e00-\u9fa5 (中文)
\x3130-\x318F (韩文
\xAC00-\xD7A3 (韩文)
\u0800-\u4e00 (日文)
ps: 韩文是大于[\u9fa5]的字符
正则例子:

  1.  
  2. preg_replace(”/([\x80-\xff])/”,”",$str);
  3. preg_replace(”/([u4e00-u9fa5])/”,”",$str);
  4.  

二、代码例子

  1.  
  2. //判断内容里有没有中文-GBK (PHP)
  3. function check_is_chinese($s){
  4.     return preg_match(‘/[\x80-\xff]./’, $s);
  5. }
  6. //获取字符串长度-GBK (PHP)
  7. function gb_strlen($str){
  8.     $count = 0;
  9.     for($i=0; $i<strlen($str); $i++){
  10.         $s = substr($str, $i, 1);
  11.         if (preg_match("/[\x80-\xff]/", $s)) ++$i;
  12.           ++$count;
  13.     }
  14.     return $count;
  15. }
  16. //截取字符串字串-GBK (PHP)
  17. function gb_substr($str, $len){
  18.     $count = 0;
  19.     for($i=0; $i<strlen($str); $i++){
  20.         if($count == $len) break;
  21.         if(preg_match("/[\x80-\xff]/", substr($str, $i, 1))) ++$i;
  22.           ++$count;        
  23.     }
  24.     return substr($str, 0, $i);
  25. }
  26. //统计字符串长度-UTF8 (PHP)
  27. function utf8_strlen($str) {
  28.     $count = 0;
  29.     for($i = 0; $i < strlen($str); $i++){
  30.         $value = ord($str[$i]);
  31.         if($value > 127) {
  32.             $count++;
  33.             if($value >= 192 && $value <= 223) $i++;
  34.             elseif($value >= 224 && $value <= 239) $i = $i + 2;
  35.             elseif($value >= 240 && $value <= 247) $i = $i + 3;
  36.             else die(‘Not a UTF-8 compatible string’);
  37.         }
  38.         $count++;
  39.     }
  40.     return $count;
  41. }
  42. //截取字符串-UTF8(PHP)
  43. function utf8_substr($str,$position,$length){
  44.     $start_position = strlen($str);
  45.     $start_byte = 0;
  46.     $end_position = strlen($str);
  47.     $count = 0;
  48.     for($i = 0; $i < strlen($str); $i++){
  49.         if($count >= $position && $start_position > $i){
  50.             $start_position = $i;
  51.             $start_byte = $count;
  52.         }
  53.         if(($count-$start_byte)>=$length) {
  54.             $end_position = $i;
  55.             break;
  56.         }    
  57.         $value = ord($str[$i]);
  58.         if($value > 127){
  59.             $count++;
  60.             if($value >= 192 && $value <= 223) $i++;
  61.             elseif($value >= 224 && $value <= 239) $i = $i + 2;
  62.             elseif($value >= 240 && $value <= 247) $i = $i + 3;
  63.             else die(‘Not a UTF-8 compatible string’);
  64.         }
  65.         $count++;
  66.     }
  67.     return(substr($str,$start_position,$end_position-$start_position));
  68. }
  69.  

=============

  1.  
  2. //判断是否是有韩文-UTF-8 (JavaScript)
  3. function checkKoreaChar(str) {
  4.     for(i=0; i<str.length; i++) {
  5.         if(((str.charCodeAt(i) > 0×3130 && str.charCodeAt(i) < 0x318F) || (str.charCodeAt(i) >= 0xAC00 && str.charCodeAt(i) <= 0xD7A3))) {
  6.             return true;
  7.         }
  8.     }
  9.     return false;
  10. }
  11. //判断是否有中文字符-GBK (JavaScript)
  12. function check_chinese_char(s){
  13.     return (s.length != s.replace(/[^\x00-\xff]/g,"**").length);
  14. }
  15.  

Powered by 00RZ