php对gb2312的汉字进行编码,PHP实现gb2312、UTF-8等字符和unicode间的编码转换及PHP版unescape...

PHP实现gb2312、UTF-8等字符和unicode间的编码转换及PHP版unescape

/**

* 将字符串转换成unicode编码

*

* @param string $input

* @param string $input_charset

* @return string

*/

function str_to_unicode($input, $input_charset = 'gbk'){

$input = iconv($input_charset, "gbk", $input);

preg_match_all("/[\x80-\xff]?./", $input, $ar);

$b = array_map('utf8_unicode_', $ar[0]);

$outstr = join("", $b);

return $outstr;

}

function utf8_unicode_($c, $input_charset = 'gbk'){

$c = iconv($input_charset, 'utf-8', $c);

return utf8_unicode($c);

}

// utf8 -> unicode

function utf8_unicode($c) {

switch(strlen($c)) {

case 1:

return $c;

case 2:

$n = (ord($c[0]) & 0x3f) << 6;

$n += ord($c[1]) & 0x3f;

break;

case 3:

$n = (ord($c[0]) & 0x1f) << 12;

$n += (ord($c[1]) & 0x3f) << 6;

$n += ord($c[2]) & 0x3f;

break;

case 4:

$n = (ord($c[0]) & 0x0f) << 18;

$n += (ord($c[1]) & 0x3f) << 12;

$n += (ord($c[2]) & 0x3f) << 6;

$n += ord($c[3]) & 0x3f;

break;

}

return "$n;";

}

/**

* 将unicode字符转换成普通编码字符

*

* @param string $str

* @param string $out_charset

* @return string

*/

function str_from_unicode($str, $out_charset = 'gbk'){

$str = preg_replace_callback("|([0-9]{1,5});|", 'unicode2utf8_', $str);

$str = iconv("UTF-8", $out_charset, $str);

return $str;

}

function unicode2utf8_($c){

return unicode2utf8($c[1]);

}

function unicode2utf8($c){

$str="";

if ($c < 0x80) {

$str.=$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 $str;

}

/**

* 模拟JS里的unescape

*

* @param unknown_type $str

* @return unknown

*/

function unescape($str) {

$str = rawurldecode($str);

preg_match_all("/(?:%u.{4})|.{4};|\d+;|.+/U",$str,$r);

$ar = $r[0];

#print_r($ar);

foreach($ar as $k=>$v) {

if(substr($v,0,2) == "%u")

$ar[$k] = iconv("UCS-2","GB2312",pack("H4",substr($v,-4)));

elseif(substr($v,0,3) == "")

$ar[$k] = iconv("UCS-2","GB2312",pack("H4",substr($v,3,-1)));

elseif(substr($v,0,2) == "") {

echo substr($v,2,-1)."

";

$ar[$k] = iconv("UCS-2","GB2312",pack("n",substr($v,2,-1)));

}

}

return join("",$ar);

}

?>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值