Node.js urlencode二进制数据

时间:2019-08-12 20:33:09

标签: node.js urlencode

是否可以使用Nodejs URL模块对二进制数据进行url编码?

例如,字节组 \ x12 \ x34 \ x56 \ x78 \ x9a 一旦编码,就等同于%124Vx%9a

在Python中执行此操作没有问题:

>>> urllib.parse.urlencode({'q':b'\x12\x34\x56\x78\x9a'})
'q=%124Vx%9A'

在Nodejs中尝试此操作,我得到的编码错误为%124Vx%EF%BF%BD

> u = new URL('http://www.google.com');
> qvar = Buffer('123456789a','hex')
<Buffer 12 34 56 78 9a>
> u.searchParams.set('q',qvar.toString('utf8'))
> u
URL {
  href: 'http://www.google.com/?q=%124Vx%EF%BF%BD',
  origin: 'http://www.google.com',
  protocol: 'http:',
  username: '',
  password: '',
  host: 'www.google.com',
  hostname: 'www.google.com',
  port: '',
  pathname: '/',
  search: '?q=%124Vx%EF%BF%BD',
  searchParams: URLSearchParams { 'q' => '\u00124Vx�' },
  hash: ''
}

如果我可以将字节缓冲区直接传递给 searchParams.set(),我想我会很幸运。 URL 对象需要使用字符串作为其参数,因此如何将原始十六进制转换为将其正确引用的字符串?

1 个答案:

答案 0 :(得分:1)

  • 您要使用Node.js从%124Vx%9A的缓冲区中检索<Buffer 12 34 56 78 9a>的值。

如果我的理解是正确的,作为一种方法,如何使用encoding.js模块?请认为这只是几个答案之一。

首先,请按如下所示安装encoding.js。

$ npm install encoding-japanese

示例脚本如下。

示例脚本:

var Encoding = require('encoding-japanese');

u = new URL('http://www.google.com');
qvar = Buffer.from('123456789a','hex');
console.log(qvar);

var encoded = Encoding.urlEncode(qvar);
console.log(encoded);

u.searchParams.set('q', encoded);
console.log(u);

结果:

<Buffer 12 34 56 78 9a>
%124Vx%9A
URL {
  href: 'http://www.google.com/?q=%25124Vx%259A',
  origin: 'http://www.google.com',
  protocol: 'http:',
  username: '',
  password: '',
  host: 'www.google.com',
  hostname: 'www.google.com',
  port: '',
  pathname: '/',
  search: '?q=%25124Vx%259A',
  searchParams: URLSearchParams { 'q' => '%124Vx%9A' },
  hash: ''
}

注意:

  • 如果您不想对%的{​​{1}}的值进行编码,该怎么办?
    • %124Vx%9A

参考:

如果我误解了您的问题,而这不是您想要的结果,我深表歉意。