参考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
$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
$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);
}
另外,附赠正则解码方式,未大量测试,但是用的最多的还是正则。
欢迎收藏∩_∩但请保留本文链接。