如何使用 javascript 对字符串进行unicode编码和解码操作?
unicode编码简单释义:unicode编码也叫统一码、万国码,是一种在计算机上使用的字符编码。unicode 是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。以上摘自百度百科,想深入了解的同学,可以自行找下度娘。
那么在js里,如何来使用unicode格式的编码,来表示一个字符呢?在我们web开发中,经常会遇见”\u0031”,这种形式的字符串。复习一遍js关于字符串数据类型的介绍,其中找到如下解释:字面量\unnnn 表示以十六进制代码nnnn来代表一个unicode字符(n为0-F)。例如刚才提到的“\u0031”表示数字1,“\u03a3”表示希腊字母“Σ”。
js unicode是以十六进制代码外加开头\u表示的字符串。即\unnnn,如何才能将任意字符转换成这种形式呢?首先要得到字符的 Unicode 编码,然后再将其转化成十六进制编码,那么js unicode字符编码的问题就迎刃而解,在javascript里,有一个字符串方法:charCodeAt();这个方法可返回指定位置的字符的 Unicode 编码。这个返回值是 0 - 65535 之间的整数。需要传入一个参数:这个是参数表示字符串中某个位置的数字,即字符在字符串中的下标。例如:
var str = "123"; console.log(str.charCodeAt(0)) //49 字符1的unicdoe编码是:49。
得到了字符的unicode编码,再使用字符串方法:toString(16)。就得到了js unicode的十六进制代码。例如:
var str = "123"; str = str.charCodeAt(0); console.log(str.toString(16)) // 31
字符1的unicode编码的十六进制是31,我们需要的js unicode字面量形式是\unnnn;所以字符1的js unicdoe编码就是\u0031(使用00补足4位)。
我们可以写个方法来实现这一功能,先贴下代码:
var Unicode = { stringify: function (str) { var res = [], len = str.length; for (var i = 0; i < len; ++i) { res[i] = ("00" + str.charCodeAt(i).toString(16)).slice(-4); } return str ? "\\u" + res.join("\\u") : ""; }, parse: function (str) { str = str.replace(/\\/g, "%"); return unescape(str); } };
unicode.stringify()是js unicode编码方法,方法里循环了字符串里每个字符unicode=》十六进制的操作,其中slice(-4),是为了保证每个字符的十六进制都是nnnn的形式。然后再操作数组使每项加入”\u”,“\”要进行字符串转义。所以传入的参数是“\u”。
unicode.parse()是js unicode解码方法,这个方法很简单了,直接使用unescape()方法,该函数的工作原理是这样的:通过找到形式为 %xx 和 %uxxxx 的字符序列(x 表示十六进制的数字),用 Unicode 字符 \u00xx 和 \uxxxx 替换这样的字符序列进行解码。所以操作之前,先把“\u”替换成“%”。
js unicode 操作demo: http://www.laoona.com/learn/2014/FE/unicode.html