function gb2utf8($gbstr) {
    global $CODETABLE;
    if(trim($gbstr)=="") return $gbstr;
    if(empty($CODETABLE)){
        $filename = dirname(__FILE__)."/gb2312-utf8.table";
        $fp = fopen($filename,"r");
        while ($l = fgets($fp,15))
        { $CODETABLE[hexdec(substr($l, 0, 6))] = substr($l, 7, 6); }
        fclose($fp);
    }
    $ret = "";
    $utf8 = "";
    while ($gbstr) {
        if (ord(substr($gbstr, 0, 1)) > 0x80) {
            $thisW = substr($gbstr, 0, 2);
            $gbstr = substr($gbstr, 2, strlen($gbstr));
            $utf8 = "";
            @$utf8 = u2utf8(hexdec($CODETABLE[hexdec(bin2hex($thisW)) - 0x8080]));
            if($utf8!=""){
                for ($i = 0;$i < strlen($utf

;$i += 3)
                    $ret .= chr(substr($utf8, $i, 3));
            }
        }
        else
        {
            $ret .= substr($gbstr, 0, 1);
            $gbstr = substr($gbstr, 1, strlen($gbstr));
        }
    }
    return $ret;
}
function u2utf8($c)
{
 for($i=0;$i<count($c);$i++)
 $str="";
 if ($c < 0x80) {
 $str.=$c;
 }
 else if ($c < 0x800) {
 $str.=(0xC0 | $c>>6);
 $str.=(0x80 | $c & 0x3F);
 }
 else if ($c < 0x10000) {
 $str.=(0xE0 | $c>>12);
 $str.=(0x80 | $c>>6 & 0x3F);
 $str.=(0x80 | $c & 0x3F);
 }
 else if ($c < 0x200000) {
 $str.=(0xF0 | $c>>1

;
 $str.=(0x80 | $c>>12 & 0x3F);
 $str.=(0x80 | $c>>6 & 0x3F);
 $str.=(0x80 | $c & 0x3F);
 }
return $str;
}