Node.js Express.js是否尊重查询字符串的RFC-3986?

Node.js Express.js是否尊重查询字符串的RFC-3986?,node.js,express,query-string,querystringparameter,Node.js,Express,Query String,Querystringparameter,ExpressJs在解码查询字符串参数时是否尊重/使用RFC-3986标准? 为什么接受直接字符“è”,但不接受编码版本“%E8” 测试Expressjs http服务器 'use strict'; const express = require('express'); const bodyParser = require('body-parser'); // parse application/x-www-form-urlencoded app.use(bodyParser.urlenco

ExpressJs在解码查询字符串参数时是否尊重/使用RFC-3986标准? 为什么接受直接字符“è”,但不接受编码版本“%E8”

测试Expressjs http服务器

'use strict';

const express = require('express');
const bodyParser = require('body-parser');

// parse application/x-www-form-urlencoded
app.use(bodyParser.urlencoded({ extended: false }));

app.get('/test?', (req, res, next) => {
  console.log(req.query);
  res.status(200);
});

app.listen(4567, '127.0.0.1', () => {
    console.log('test http server started');
});
请求

GET localhost:4567/test?message=lorem+ipsum%2C%20foo+%E8+bar
GET localhost:4567/test?message=lorem+ipsum%2C%20foo+bar
GET localhost:4567/test?message=lorem+ipsum%2C%20foo+è+bar
预期日志

{ message: 'lorem ipsum, foo è bar' }
{ message: 'lorem+ipsum%2C%20foo+è+bar' }
服务器日志

{ message: 'lorem+ipsum%2C%20foo+%E8+bar' }
{ message: 'lorem ipsum, foo bar' }
{ message: 'lorem ipsum, foo è bar' }
如果我们删除%E8字符“è”

请求

GET localhost:4567/test?message=lorem+ipsum%2C%20foo+%E8+bar
GET localhost:4567/test?message=lorem+ipsum%2C%20foo+bar
GET localhost:4567/test?message=lorem+ipsum%2C%20foo+è+bar
服务器日志

{ message: 'lorem+ipsum%2C%20foo+%E8+bar' }
{ message: 'lorem ipsum, foo bar' }
{ message: 'lorem ipsum, foo è bar' }
这里()我可以读到,对于URI,它可以应用RFC-3986,它不允许像è、è、è这样的字符

看来Express拒绝了这些角色,但如果我们尝试

请求

GET localhost:4567/test?message=lorem+ipsum%2C%20foo+%E8+bar
GET localhost:4567/test?message=lorem+ipsum%2C%20foo+bar
GET localhost:4567/test?message=lorem+ipsum%2C%20foo+è+bar
预期日志

{ message: 'lorem ipsum, foo è bar' }
{ message: 'lorem+ipsum%2C%20foo+è+bar' }
服务器日志

{ message: 'lorem+ipsum%2C%20foo+%E8+bar' }
{ message: 'lorem ipsum, foo bar' }
{ message: 'lorem ipsum, foo è bar' }
所以直接字符“è”被接受,但编码版本%E8不被接受

我试图阅读ExpressJS源代码,但找不到响应。

基本上自行解决:

首先,我发现在UTF-8中,‘è’的十六进制是‘C3A8’而不是‘E8’

因此Express可能接受所有UTF-8字符,而不应用RFC-3986标准。这将解释为什么不接受“E8”,而接受直接字符“è”E8'不被接受,因为它与UTF-8中的任何内容都不匹配