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
欢迎收藏∩_∩但请保留本文链接。