首页 > 代码库 > PHP 汉字 特殊字符 UNICODE 编码 解码 高性能简洁实现方案

PHP 汉字 特殊字符 UNICODE 编码 解码 高性能简洁实现方案

网上,针对汉字、特殊字符的UNICODE 编码、解码实现,方法诸多,但是大多是复制粘贴,没有新意!

PHP UNICODE 汉字 编码:

var_dump(json_encode(‘2018 ABC 我是中国人!网站:http://my.oschina.net/cart/‘));
上述就实现了PHP中对汉字、特殊字符的 UNICODE 编码!

多么easy!

上面会输出:

string(96) ""2018 ABC \u6211\u662f\u4e2d\u56fd\u4eba\uff01\u7f51\u7ad9\uff1ahttp:\/\/my.oschina.net\/cart\/""

PHP UNICODE 汉字 解码:

如果我们尝试


var_dump(json_decode(‘2018 ABC \u6211\u662f\u4e2d\u56fd\u4eba\uff01\u7f51\u7ad9\uff1ahttp:\/\/my.oschina.net\/cart\/‘));
或者


var_dump(json_decode("2018 ABC \u6211\u662f\u4e2d\u56fd\u4eba\uff01\u7f51\u7ad9\uff1ahttp:\/\/my.oschina.net\/cart\/"));
结果都是
NULL
是错误的,并没有按照我们的意愿解码!


因为你并没有传入正确的json格式字符串!!!

心细的同学肯定已经发现,上述json_encode输出的是

"2018 ABC \u6211\u662f\u4e2d\u56fd\u4eba\uff01\u7f51\u7ad9\uff1ahttp:\/\/my.oschina.net\/cart\/"
注意输出字符串两段的 双引号这也是输出 json_encode 内容的一部分!很重要!


所以我们如果想正确的用json_decode解码,我们以下操作即可:

var_dump(json_decode(‘"2018 ABC \u6211\u662f\u4e2d\u56fd\u4eba\uff01\u7f51\u7ad9\uff1ahttp:\/\/my.oschina.net\/cart\/"‘));
哈哈,正确的解码输出了我们的结果:


string(63) "2018 ABC 我是中国人!网站:http://my.oschina.net/cart/"


看看,没有什么技术含量,都是基本知识的掌握!但是为什么国人都想到很多奇葩的方式来解码呢?基本功不扎实,就只能缘木求鱼啦,就算实现了,最后性能还很差!

有的用pack,有的用utf8_decode、mb_convert_encoding、iconv.....


PHP UNICODE 汉字 不规则形式 解码:


也许有的屌丝没有那么幸运,得到的字符串形如:


2018 ABC u6211u662fu4e2du56fdu4ebauff01u7f51u7ad9uff1ahttp:\/\/my.oschina.net\/cart\/
怎么解码?怎么破?


心细的同事已经发现,所有的u少了\,应该是\u,u后面跟随的是【0-9a-f】4位字符串!

老衲潇洒破之(preg_replace的e修饰符在PHP新版本已经弃用了,所以官方推荐使用preg_replace_callback代替之!):

$str = ‘2018 ABC u6211u662fu4e2du56fdu4ebauff01u7f51u7ad9uff1ahttp:\/\/my.oschina.net\/cart\/‘;
var_dump(json_decode(‘"‘.preg_replace_callback("/u([0-9a-f]{4})/", function($match){return ‘\u‘.$match[1];}, $str).‘"‘));



就1句话,多么潇洒!绿色无污染,老少皆宜!深藏功与名!

感谢http://my.oschina.net/cart/大神以最优雅的方式完美解决了 PHP 汉字 特殊字符 UNICODE 编码 解码 高性能简洁实现方案

PHP 汉字 特殊字符 UNICODE 编码 解码 高性能简洁实现方案