首页 > php代码 > PHP实现字符串与unicode编码互转

PHP实现字符串与unicode编码互转

参考1:http://blog.csdn.net/chengfei112233/article/details/7183227(评论部分)

参考2:http://blog.sina.com.cn/s/blog_415bd7070100ajdi.html(评论部分)


参考的文章作者都很遗憾会出现或多或少的bug。

参考1中编码方法没有考虑不同平台下UCS-2和UCS-2BE导致编码失败(刚好评论可以解决),而且解码方法会导致丢失部分字符,如/。

参考2中的编码方法没有考虑不足两位补0(刚好由参考1可以解决),解码方法没有考虑匹配失败导致结果为空(刚好评论可以解决,另外评论中的方法也会出现不同平台的bug,刚要参考1可以结局)。


总结如下:

<?php
header("Content-type:text/html;charset=utf-8");
$str = '“要”、“营业”、“食”、“品”';
var_dump(unicodeEncode($str));
var_dump(decodeUnicode(unicodeEncode($str)));


/**
 * 将字符串编码为unicode
 * @param string $string
 * @param string $encoding
 * @param string $prefix
 * @param string $postfix
 * @return string
 */
function unicodeEncode($string, $encoding = "UTF-8", $prefix = "\\u", $postfix = '') {
	if(strtoupper(substr(PHP_OS, 0, 3)) === "WIN") {
		$string = iconv('UTF-8', 'UCS-2', $string);
    }else{
        $string = iconv('UTF-8', 'UCS-2BE', $string);
    }
    $len = strlen($string);
    $str = '';
    for($i = 0; $i < $len - 1; $i = $i + 2) {
        $c = $string[$i];
        $c2 = $string[$i + 1];
        if(ord($c) > 0) {
            $str .= $prefix . base_convert(ord($c), 10, 16) . str_pad(base_convert(ord($c2), 10, 16), 2, 0, STR_PAD_LEFT) . $postfix;
        } else {
            $str .= $prefix . str_pad(base_convert(ord($c2), 10, 16), 4, 0, STR_PAD_LEFT) . $postfix;
        }
    }
	return $str;
}

/**
 * 将unicode解码为字符串
 * @param string $unistr
 */
function decodeUnicode($unistr) {
	// 转换编码,将Unicode编码转换成可以浏览的utf-8编码
	$isWin = strtoupper(substr(PHP_OS, 0, 3)) === "WIN" ? true : false;
    $pattern = '/(\\\\u([0-9a-f]{4}))/i';
    preg_match_all($pattern, $unistr, $matches);
    $temp_num = count($matches [0]);
    $search_arr = $matches[0];
    $replace_arr = array();
    for($i = 0; $i < $temp_num; $i ++) {
        $str_temp = $search_arr [$i];
        $code = base_convert(substr($str_temp, 2, 2), 16, 10);
        $code2 = base_convert(substr($str_temp, 4), 16, 10);
        $c = chr($code) . chr($code2);
        $c = $isWin ? iconv('UCS-2', 'UTF-8', $c) : iconv('UCS-2BE', 'UTF-8', $c);
        $replace_arr[$i] = $c;
    }
    return str_replace($search_arr, $replace_arr, $unistr);
	// 使用正则也可以
	return preg_replace_callback('/\\\\u([0-9a-f]{4})/i', function($matches) {
		if(function_exists("mb_convert_encoding")) {
			return mb_convert_encoding(pack("H*", $matches[1]), "UTF-8", "UCS-2BE");
		}else{
			return iconv('UCS-2', 'UTF-8', pack('H4', $matches[1]));
		}
	}, $unistr);
}


另外,附赠正则解码方式,未大量测试,但是用的最多的还是正则。






教程网址:http://www.phprm.com/code/convert-unicode.html

欢迎收藏∩_∩但请保留本文链接。

标签:编码 转换 unicode 解码

相关文章