前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >NodeJS模块研究 - querystring

NodeJS模块研究 - querystring

作者头像
心谭博客
发布2020-04-21 15:22:19
7260
发布2020-04-21 15:22:19
举报
文章被收录于专栏:YuanXin

querystring 是专门用来解析和格式化 URL 的查询字符串 URL 的工具。

  • 序列化和解析查询字符串
  • 不同语言的兼容处理
  • 百分比编码的原理

序列化和解析查询字符串

形如w=%D6%D0%CE%C4&foo=bar的字符串,就符合查询字符串的格式。querystring 提供了两种 api,一类用于序列化(编码),简单来说就是json => url查询字符串;另一类用于解析(解码),简单来说就是 url查询字符串 => json

  • 序列化 API:querystring.encode()querystring.stringify(),两者完全一样
  • 解析 API:querystring.decode()querystring.parse(),两者完全一样
代码语言:javascript
复制
const querystring = require("querystring");

const params = {
    foo: "bar",
    baz: ["qux", "quux"],
    corge: ""
};

// output: foo=bar&baz=qux&baz=quux&corge=
console.log(querystring.encode(params));

不同语言的兼容处理

由于不同的语言中,百分比的编码规则有区别。例如对字符串 心 谭 来说:

  • 在 java 中,空格换成+号,结果是%E5%BF%83+%E8%B0%AD
  • 在 js 中,空格换成字节码,结果是%E5%BF%83%20%E8%B0%AD

在 querystring.encode() 和 querystring.decode() 接口中,可以使用特殊的百分比编解码函数。

代码语言:javascript
复制
const params = {
    key: "原文地址: http://xxoo521.com/#"
};

querystring.stringify(params, {
    encodeURIComponent: encodeURI // 覆盖默认的百分比编码函数
});

querystring.parse("xxoo521.com%2F%23", {
    decodeURIComponent: decodeURI // 覆盖默认的百分比解码函数
});

百分比编码的原理

前面有提到百分比编码,也就是 js 中常用的 encodeURIComponent 函数。它的编码规则如下:

  • 部分字符不编码:abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_.!~*'()
  • 其他字符:获得 16 进制的字节码(大写),每个字节前添加%

代码如下:

代码语言:javascript
复制
/**
 * 将单个字符按编码要求处理成百分比字节码
 * @param {string} ch
 */
function chToHex(ch) {
    const buf = Buffer.from(ch, "utf8");
    let hex = "";
    for (let i = 0; i < buf.byteLength; ++i) {
        hex = hex + "%" + buf[i].toString(16).toLocaleUpperCase();
    }
    return hex;
}

const chs =
    "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_.!~*'()";

/**
 * @param {string} str
 * @return {string}
 */
function myEncodeURIComponent(str) {
    if (str === null || !str.trim().length) {
        return str;
    }

    let ans = "";
    const length = str.length;
    for (let i = 0; i < length; ++i) {
        if (chs.includes(str[i])) {
            ans += str[i];
        } else {
            ans += chToHex(str[i]);
        }
    }
    return ans;
}

对于原文地址:心谭博客这段字符串的编码结果是:

代码语言:javascript
复制
%E5%8E%9F%E6%96%87%E5%9C%B0%E5%9D%80%EF%BC%9A%E5%BF%83%E8%B0%AD%E5%8D%9A%E5%AE%A2

参考链接

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-01-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 序列化和解析查询字符串
  • 不同语言的兼容处理
  • 百分比编码的原理
  • 参考链接
相关产品与服务
文件存储
文件存储(Cloud File Storage,CFS)为您提供安全可靠、可扩展的共享文件存储服务。文件存储可与腾讯云服务器、容器服务、批量计算等服务搭配使用,为多个计算节点提供容量和性能可弹性扩展的高性能共享存储。腾讯云文件存储的管理界面简单、易使用,可实现对现有应用的无缝集成;按实际用量付费,为您节约成本,简化 IT 运维工作。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档