Nodejs如何处理非utf8编码也没encode的url?

Nodejs如何处理非utf8编码也没encode的url?

产品要求解决。。。说是为了方便开发者在IE浏览器里调试,url里可能含有中文,这样请求就变成了gbk的中文,但我得到的req.url已经被转成乱码了,输出req也没发现有buffer 我知道用net模块自己搭建个http服务器可以做到,不过用http模块搭建的话怎么处理呢?

3 回复

Node.js 如何处理非 UTF-8 编码且未编码的 URL?

在处理来自不同编码(如 GBK)的 URL 时,Node.js 默认使用 UTF-8 编码来解析请求。如果你收到的 URL 中包含未编码的中文字符,并且这些字符是以 GBK 编码形式传输的,那么 req.url 将会显示为乱码。

为了正确处理这种情况,我们需要手动将请求中的 URL 从 GBK 编码转换为 UTF-8 编码。以下是一个简单的示例代码,展示了如何实现这一过程:

const http = require('http');
const iconv = require('iconv-lite');

// 创建一个 HTTP 服务器
const server = http.createServer((req, res) => {
    // 获取原始的 URL 字符串
    let originalUrl = req.url;

    // 将 GBK 编码的 URL 转换为 UTF-8 编码
    const decodedUrl = iconv.decode(Buffer.from(originalUrl, 'binary'), 'GBK').toString();

    // 输出解码后的 URL
    console.log(`Decoded URL: ${decodedUrl}`);

    // 处理请求逻辑...
    res.writeHead(200, { 'Content-Type': 'text/plain' });
    res.end(`Hello, your decoded URL is: ${decodedUrl}`);
});

server.listen(3000, () => {
    console.log('Server running at http://localhost:3000/');
});

解释

  1. 引入依赖:我们首先引入 http 模块和 iconv-lite 库。iconv-lite 是一个用于编码和解码字符串的库,支持多种字符集,包括 GBK 和 UTF-8。

  2. 创建 HTTP 服务器:我们使用 http.createServer 方法创建一个 HTTP 服务器。

  3. 获取原始 URL:通过 req.url 获取原始的 URL 字符串。

  4. 解码 URL:我们将原始的 URL 字符串从 GBK 编码转换为 UTF-8 编码。具体步骤如下:

    • 使用 Buffer.from(originalUrl, 'binary') 将原始字符串转换为 Buffer 对象。
    • 使用 iconv.decode 方法将 Buffer 对象从 GBK 编码解码为 UTF-8 编码。
  5. 输出解码后的 URL:我们将解码后的 URL 打印到控制台,并返回给客户端。

  6. 启动服务器:最后,我们使用 server.listen 方法启动服务器,监听端口 3000。

通过这种方式,你可以确保即使 URL 中包含未编码的 GBK 字符,也能被正确地解析和处理。


req.url 你在得到的时候就已经乱码了,那还怎么解决。

https://github.com/alsotang/urlencode 你看看这个 url encode 的库能不能解决你的问题。

要处理非UTF-8编码且未进行URL编码的URL(例如GBK编码),你可以使用Node.js的querystring模块和一个第三方库来解码这些参数。这里我们推荐使用iconv-lite库来转换字符编码,并使用querystring模块解析URL查询字符串。

示例代码

首先安装必要的依赖:

npm install iconv-lite querystring

然后编写如下代码:

const http = require('http');
const querystring = require('querystring');
const iconv = require('iconv-lite');

const server = http.createServer((req, res) => {
    // 获取原始的未解码的请求体
    let body = [];

    req.on('data', chunk => {
        // 将接收到的数据添加到body数组中
        body.push(chunk);
    });

    req.on('end', () => {
        // 解析body数据为Buffer对象
        body = Buffer.concat(body);

        try {
            // 使用iconv-lite将数据从GBK转换为UTF-8
            const decodedBody = iconv.decode(body, 'gbk');

            // 解析解码后的字符串
            const parsedQuery = querystring.parse(decodedBody);

            // 输出解析结果
            console.log(parsedQuery);

            // 返回响应
            res.writeHead(200, { 'Content-Type': 'text/plain' });
            res.end(JSON.stringify(parsedQuery));
        } catch (error) {
            console.error("Error decoding request:", error);
            res.writeHead(500, { 'Content-Type': 'text/plain' });
            res.end("Internal Server Error");
        }
    });
});

server.listen(3000, () => {
    console.log('Server is running on port 3000');
});

解释

  1. 依赖安装iconv-lite用于处理不同编码之间的转换,querystring用于解析URL查询字符串。
  2. 创建HTTP服务器:使用Node.js内置的http模块创建服务器。
  3. 监听数据事件:当客户端发送数据时,将其累积到body数组中。
  4. 结束事件:所有数据接收完毕后,将body数组合并成一个Buffer对象。
  5. 解码数据:使用iconv-lite将GBK编码的数据转换为UTF-8。
  6. 解析查询字符串:使用querystring.parse方法将解码后的字符串解析为对象。
  7. 返回响应:向客户端返回解析结果或错误信息。

这段代码可以帮助你正确处理包含GBK编码的URL请求,并将其解析为UTF-8格式。

回到顶部