接收参数: 无 源码: 复制代码 代码如下: // 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); };