node.js中的querystring.unescape方法使用说明

  方法说明:

  该方法使可用来重写 querystring.parse

  语法:

  

复制代码 代码如下:

  querystring.unescape

  接收参数:

  无

  源码:

  

复制代码 代码如下:

  // a safe fast alternative to decodeURIComponent

  QueryString.unescapeBuffer = function(s, decodeSpaces) {

  var out = new Buffer(s.length);

  var state = 'CHAR'; // states: CHAR, HEX0, HEX1

  var n, m, hexchar;

  for (var inIndex = 0, outIndex = 0; inIndex <= s.length; inIndex++) {

  var c = s.charCodeAt(inIndex);

  switch (state) {

  case 'CHAR':

  switch (c) {

  case charCode('%'):

  n = 0;

  m = 0;

  state = 'HEX0';

  break;

  case charCode('+'):

  if (decodeSpaces) c = charCode(' ');

  // pass thru

  default:

  out[outIndex++] = c;

  break;

  }

  break;

  case 'HEX0':

  state = 'HEX1';

  hexchar = c;

  if (charCode('0') <= c && c <= charCode('9')) {

  n = c - charCode('0');

  } else if (charCode('a') <= c && c <= charCode('f')) {

  n = c - charCode('a') + 10;

  } else if (charCode('A') <= c && c <= charCode('F')) {

  n = c - charCode('A') + 10;

  } else {

  out[outIndex++] = charCode('%');

  out[outIndex++] = c;

  state = 'CHAR';

  break;

  }

  break;

  case 'HEX1':

  state = 'CHAR';

  if (charCode('0') <= c && c <= charCode('9')) {

  m = c - charCode('0');

  } else if (charCode('a') <= c && c <= charCode('f')) {

  m = c - charCode('a') + 10;

  } else if (charCode('A') <= c && c <= charCode('F')) {

  m = c - charCode('A') + 10;

  } else {

  out[outIndex++] = charCode('%');

  out[outIndex++] = hexchar;

  out[outIndex++] = c;

  break;

  }

  out[outIndex++] = 16 * n + m;

  break;

  }

  }

  // TODO support returning arbitrary buffers.

  return out.slice(0, outIndex - 1);

  };