PHP中GBK和UTF8编码处理

编码

一、编码范围

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]的字符

正则例子:
preg_replace("/([\x80-\xff])/","",$str);
preg_replace("/([u4e00-u9fa5])/","",$str);

二、代码例子

//判断内容里有没有中文-GBK (PHP)
function check_is_chinese($s){
    return preg_match('/[\x80-\xff]./', $s);
}

//获取字符串长度-GBK (PHP)
function gb_strlen($str){
    $count = 0;
    for($i=0; $i<strlen($str); $i++){
        $s = substr($str, $i, 1);
        if (preg_match("/[\x80-\xff]/", $s)) ++$i;
        ++$count;
    }
    return $count;
}

//截取字符串字串-GBK (PHP)
function gb_substr($str, $len){
    $count = 0;
    for($i=0; $i<strlen($str); $i++){
        if($count == $len) break;
        if(preg_match("/[\x80-\xff]/", substr($str, $i, 1))) ++$i;
        ++$count;       
    }
    return substr($str, 0, $i);
}

//统计字符串长度-UTF8 (PHP)
function utf8_strlen($str) {
    $count = 0;
    for($i = 0; $i < strlen($str); $i++){
        $value = ord($str[$i]);
        if($value > 127) {
            $count++;
            if($value >= 192 && $value <= 223) $i++;
            elseif($value >= 224 && $value <= 239) $i = $i + 2;
            elseif($value >= 240 && $value <= 247) $i = $i + 3;
            else die('Not a UTF-8 compatible string');
        }
        $count++;
    }
    return $count;
}

//截取字符串-UTF8(PHP)
function utf8_substr($str,$position,$length){
    $start_position = strlen($str);
    $start_byte = 0;
    $end_position = strlen($str);
    $count = 0;
    for($i = 0; $i < strlen($str); $i++){
        if($count >= $position && $start_position > $i){
            $start_position = $i;
            $start_byte = $count;
        }
        if(($count-$start_byte)>=$length) {
            $end_position = $i;
            break;
        }   
        $value = ord($str[$i]);
        if($value > 127){
            $count++;
            if($value >= 192 && $value <= 223) $i++;
            elseif($value >= 224 && $value <= 239) $i = $i + 2;
            elseif($value >= 240 && $value <= 247) $i = $i + 3;
            else die('Not a UTF-8 compatible string');
        }
        $count++;

    }
    return(substr($str,$start_position,$end_position-$start_position));
}

//字符串长度统计-UTF8 [中文3个字节,俄文、韩文占2个字节,字母占1个字节] (Ruby)
def utf8_string_length(str)
    temp = CGI::unescape(str)
    i = 0;
    j = 0;
    temp.length.times{|t|
        if temp[t] < 127
            i += 1
        elseif temp[t] >= 127 and temp[t] < 224
            j += 1
            if 0 == (j % 2)
                i += 2
                j = 0
            end
        else
            j += 1
            if 0 == (j % 3)
                i +=2
                j = 0
            end
        end
    }
    return i
}

//判断是否是有韩文-UTF-8 (JavaScript)
function checkKoreaChar(str) {
    for(i=0; i<str.length; i++) {
        if(((str.charCodeAt(i) > 0x3130 && str.charCodeAt(i) < 0x318F) || (str.charCodeAt(i) >= 0xAC00 && str.charCodeAt(i) <= 0xD7A3))) {
            return true;
        }
    }
    return false;
}
//判断是否有中文字符-GBK (JavaScript)
function check_chinese_char(s){
    return (s.length != s.replace(/[^\x00-\xff]/g,"**").length);
}

 

三、参考文档

http://www.unicode.org/
http://examples.oreilly.com/cjkvinfo/doc/cjk.inf
http://www.ansell-uebersetzungen.com/gbuni.html
http://www.haiyan.com/steelk/navigator/ref/gbk/gbindex.htm
http://baike.baidu.com/view/40801.htm
http://www.chedong.com/tech/hello_unicode.html
 

 

时间: 2024-11-10 00:51:45

PHP中GBK和UTF8编码处理的相关文章

PHP中GBK和UTF8编码处理(中文,韩文)

一.编码范围 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]的字符 正则例子: preg_replace("/([x80-xff])/","",$s

gbk和utf8编码自动识别方法[php版]

目前中文网页主流的编码为gbk和utf8两种编码.因此,我们做编码识别的前提是,编码不是gbk就是utf8. 编码自动识别的基本思想如下: 1.看给定的字节串是否符合utf8编码规则.如果不符合则为gbk编码.具体utf8编码规则件日志<utf8编码规则>. 2.如果给定的字节串中没有符合utf8三字节规则的,则为gbk编码.中文在utf8中占三个字节. 3.如果给定的字节串能对应上gbk编码中的中文,且无法对应上utf8编码中的中文,则为gbk编码. 4.特殊情况,特殊处理.如 "

ios-OC中怎样将UTF8编码转换成中文

问题描述 OC中怎样将UTF8编码转换成中文 如题:有一个Person类,里面重写了description方法,实现返回姓名,年龄等信息.这样我可以直接通过NSLog(@""%@""per); 来输出对象信息.但是如果我把对象存入数组中,然后输出数组:NSLog(@""%@"" array);这样输出的结果都是UTF8编码.如果对象per内部的信息是因为和数字的话结果不受影响,如果是中文的话输出的就是UTF8.这是为什么呢?如

Shell脚本把文件从GBK转为UTF-8编码_linux shell

shell 脚本: #!/bin/sh ## ## convert file from GB2312 to UTF-8 ## path="$1" unset opt if [ "$2" = "force" ]; then opt="-c -s" fi if [ -z "$path" ]; then echo "nUsage: $0 <file or dir>n" elif [

charset中gbk或utf8对seo的影响

看到有人问gbk和utf-8对于seo的影响,我说点个人看法. 如果网站是面向国人的,建议使用gbk,理由如下: 1.gbk采用双字节表示汉字,utf-8采用三个字节表示汉字,从表示一个汉字所占的字节数来说,gbk相对于utf-8可以节约50%的空间. 2.目前开源的程序gbk编码相对成熟一些. 3.蜘蛛在爬行某个页面的过程中识别的charset属性值如果为gbk的话基本上可以确实为中文类型的网站(无需对后面的内容进行判断),如果为utf-8的话还需要进一步判断(例如检索全文中的字符有多少属于u

Web 开发中遇到的UTF-8编码的问题总结第1/2页_相关技巧

主要有五个方面: 一..HTML页面转UTF-8编码问题 二.PHP页面转UTF-8编码问题 三.MYSQL数据库使用UTF-8编码的问题 四.JS相关的UTF-8编码问题 五.FLASH相关的UTF-8编码问题 一.HTML页面转UTF-8编码问题 1.在<head>后,<title>前加入一行: <meta http-equiv='Content-Type' content='text/html; charset=utf-8' /> 顺序不能错,一定要在<ti

MySQL中UTF8编码的数据在cmd下乱码

花了一下午,解决MySQL在Windows的cmd下中文乱码的问题. ? 1 2 3 4 5 6 7 8 9 10 11 12 13 mysql> use abc; Database changed mysql> select * from school; +----------+--------------------+-------------------------------------------+ | schoolid | name               | address 

UTF-8编码与GBK编码的区别

一,从字节上区分 GBK的文字编码是双字节来表示的,即不论中.英文字符均使用双字节来表示,只不过为区分中文,将其最高位都定成1. UTF-8编码则是用以解决国际上字符的一种多字节编码,它对英文使用8位(即一个字节),中文使用24位(三个字节)来编码.对于英文字符较多的论坛则用UTF-8节省空间. 二,字符上区分 GBK包含全部中文字符; UTF-8则包含全世界所有国家需要用到的字符. 三,编码上区分 GBK是在国家标准GB2312基础上扩容后兼容GB2312的标准(好像还不是国家标准) UTF-

什么是GBK编码和UTF-8编码?UTF-8版本跟GBK版本有何不同

  常见建站程序的GBK版本与UTF-8版本功能是一样的.只不过编码方式不同. GBK的文字编码是双字节来表示的,即不论中.英文字符均使用双字节来表示,只不过为区分中文,将其最高位都定成1. 至于UTF-8编码则是用以解决国际上字符的一种多字节编码,它对英文使用8位(即一个字节),中文使用24位(三个字节)来编码.对于英文字符较多的网站则用UTF-8节省空间. GBK包含全部中文字符;UTF-8则包含全世界所有国家需要用到的字符. GBK是在国家标准GB2312基础上扩容后兼容GB2312的标准