用如下函数分析字符串会出现数字丢失的现象。
function uc2gb($str) {
$ret = '';
for( $i=0; $i<strlen($str)/2; $i++ ) {
$strchar='';
$charcode = ord($str[$i*2])+256*ord($str[$i*2+1]);
$strdec= dechex($charcode);
for ( $j=0; $j<strlen($strdec); $j+=2 )$strchar.=chr(hexdec(substr($strdec,$j,2)));
$ret .=iconv("UTF-16","gb2312",$strchar);
}return $ret;
}
比如,使用该函数以后
源数据中的“特色服务6”将会返回为"特色服务"
解决办法,用如下两个函数取代上面函数
function uc2gb($str) {
$ret = '';
for( $i=0; $i<strlen($str)/2; $i++ ) {
$charcode = ord($str[$i*2])+256*ord($str[$i*2+1]);
$ret .= '&#'.$charcode.";";
$ret = preg_replace("|&#([0-9]{1,5});|", "/".u2utf82gb(//1)./"", $ret);
$ret = "/$ret=/"$ret/";";
eval($ret);
}return $ret;
}
function u2utf82gb($c){
$str="";
if ($c < 0x80) {
//$str.=$c;
$str.=chr($c);
} else if ($c < 0x800) {
$str.=chr(0xC0 | $c>>6);
$str.=chr(0x80 | $c & 0x3F);
} else if ($c < 0x10000) {
$str.=chr(0xE0 | $c>>12);
$str.=chr(0x80 | $c>>6 & 0x3F);
$str.=chr(0x80 | $c & 0x3F);
} else if ($c < 0x200000) {
$str.=chr(0xF0 | $c>>18);
$str.=chr(0x80 | $c>>12 & 0x3F);
$str.=chr(0x80 | $c>>6 & 0x3F);
$str.=chr(0x80 | $c & 0x3F);
}
return iconv('UTF-8', 'GB2312', $str);
}