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})|&#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);
- }
- ?>
复制代码
转自:http://blog.everalan.com/204.html
补充:
unescape() 函数可对通过 escape() 编码的字符串进行解码。
语法 unescape(string) 参数 | 描述 | string | 必需。要解码或反转义的字符串。 |
返回值 string 被解码后的一个副本。
说明 该函数的工作原理是这样的:通过找到形式为 %xx 和 %uxxxx 的字符序列(x 表示十六进制的数字),用 Unicode 字符 \u00xx 和 \uxxxx 替换这样的字符序列进行解码。
|
上一篇: Discuz 让编辑能够解析插入mp4格式(作者:evenzhou)下一篇: 有没有专业点的网址给看看呢?
|