&#,&#x,\u之奇怪的Unicode编码以及如何使用PHP进行编码和解码

中中今天有人问我,说遇到了这种形式的字符,在浏览器上能识别,抓回来就是乱码。
首先解释下:&#;&#x;开头的为numeric character reference  数字字符参照,后面分别接十进制数字和十六进制数字。
以中国为例,分别是Unicode字符U+4E2D和U+56FD,十六进制的4E2D就是十进制的20013
转译成中和中(记得用分号做分隔符)

他们的来源一般是JS做了一段转码:

(function(window){
	window.htmlentities = {
		/**
		 * Converts a string to its html characters completely.
		 *
		 * @param {String} str String with unescaped HTML characters
		 **/
		encode : function(str) {
			var buf = [];
			
			for (var i=str.length-1;i>=0;i--) {
				buf.unshift(['&#', str[i].charCodeAt(), ';'].join(''));
			}
			
			return buf.join('');
		},
		/**
		 * Converts an html characterSet into its original character.
		 *
		 * @param {String} str htmlSet entities
		 **/
		decode : function(str) {
			return str.replace(/&#(\d+);/g, function(match, dec) {
				return String.fromCharCode(dec);
			});
		}
	};
})(window);

道理我都懂,但是PHP用什么方法替换JS的charCodeAt()方法呢?

这里,就是PHP的优势漏出来的时候了。它提供了直接进行解码的方法:

html_entity_decode()方法,直接解析html实体字符,例如:
echo html_entity_decode('中');

进行解码还不够,如何进行编码呢?

那就是使用JS的charCodeAt等价的PHP方法mb_ord:
//拼接成10位的
$dec =  '&#' .mb_ord('中').';';
//拼接成16位的
$hex =  '&#x'.dechex(mb_ord('中')).';';
//这里有个小坑,中文的话要使用mb_ord不能使用ord,不然会出现对不上的情况

enjoy it!

打赏作者

发表评论

电子邮件地址不会被公开。