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

添加时间:10-07-05 所属分类:PHP工具与代码
  转载自http://hi.baidu.com/iamljj/blog/item/c897788245ad2cae0cf4d2af.html

[code]<?
/**
* 将字符串转换成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})|&#x.{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) == "&#x")
$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);
}[/code]
  • 2

前篇:用PHP编程语言抓取网页的HTML内容汇总 后篇:如何使用PHP的GD库动态生成柱状图
发表我的评论


推荐文章   济南市老年人常用网址   济南市社会保险及职业类信息查询系统   济南市教育网址   济南二手物品交易网址收集   济南居委会网址收集
随机文章   php防止form重复提交的方法   php中get、request和post的使用   PHP 真正多线程的使用   php读取某目录下的所有同类型文件   PHP乱码问题,UTF-8(乱码),很全的说...
广告

其他推荐

因为本站所有内容均转载自其它媒体,本意为公众提供免费服务,但并不代表本网赞同其观点,也不能对其真实性验证负责,如稿件版权单位或个人不想在本网发布,请与我联系,本人会立即将其撤除,谢谢.联系方式:atseashawk@163.com QQ:99289555