php字符串转编码,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 

$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);

}

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值