引发的疑问

最近工作需要研究了qq web统一登陆的自动化。在一个接口中,看到这样的jsonp返回数据:

1
ptui_checkVC('0','!YAO','\x2c\x99\xd1\x52\xaa\x4f\x79\xad','454301401b2d23abdab402df0c3b01a2d9952fba2ef9638fd60b82bdbbed85defecef907aea290714d62f3098e6ed63bee77fda7acb5372b','3');

这种\xXXX的字符表示方式从没见过,只听说过\u的unicode字符表示,所以查了下,顺便记录下来。

javascript表示字符的六种方式

1
2
3
4
5
6
7
8
9
10
11
//摘自阮老师的es6书籍
'\z' === 'z' // true
'\172' === 'z' // true 八进制表示
'\x7A' === 'z' // true 两字节十六进制表示
'\u007A' === 'z' // true
'\u{7A}' === 'z' // true
//摘自mdn
'\uXXXX' //unicode codepoint
'\u{X}' //unicode codepoint
'\xXX' //the Latin-1 character

对于’\x’mdn说是拉丁字符表示,实际就是用单字节8位两个16进制数来表示。所以在ascii码中的字符才能使用\x这种十六进制表示方法。汉字是不行的。

unicode统一字符集是使用最广泛也是最普遍的,我们熟悉的utf-8,utf-16,utf-32都属于其中。而javascript由于设计时这些编码集还未出现,所以使用的是UCS-2字符集,造成所有字符在这门语言中都是2个字节,如果是4个字节的字符,会当作两个双字节的字符处理。
这两篇博客写的比较详细:

  1. http://www.ruanyifeng.com/blog/2014/12/unicode.html
  2. https://mathiasbynens.be/notes/javascript-escapes

总的来说,es6及其之后javascript同时支持UCS-2码点和utf-16码点。可以开始处理4字节长度的码点