如果我有这样的URL:
> u = 'http://examples.com/hello world/test'
'http://examples.com/hello world/test'
并使用node.js中内置的URL
对象将其解析为组件,它会自动进行url编码:
> uObj = new URL(u)
URL {
href: 'http://examples.com/hello%20world/test',
origin: 'http://examples.com',
protocol: 'http:',
username: '',
password: '',
host: 'examples.com',
hostname: 'examples.com',
port: '',
pathname: '/hello%20world/test',
search: '',
searchParams: URLSearchParams {},
hash: ''
}
例如,现在我可以方便地更改一些属性。
问题是,如果我后来用uObj.toString()
将其转换回URL字符串,它仍然是URL编码的!
> uObj.toString()
http://examples.com/hello%20world/test
然后,我将这个字符串进一步传递给另一个库/函数,该库/函数在输入中期望原始url,因此再次对其进行编码。
http://examples.com/hello%25%20world/test
(note %
如何转义到%25
)。
根据MDN文档,即使是内置的encodeURI()
也不能根据最新的RFC处理所有可能的情况,所以我不确定decodeURI()
是否正确工作?我可以只使用decodeURI(uObj.toString())
并平静地睡觉吗?或者我应该在这里使用一些npm模块?
1条答案
按热度按时间ljsrvy3e1#
URL中的空格(SP,U+0020)字符将被编码(并保持编码状态),因为URL的路径部分不允许使用该字符。根据RFC 3986: Uniform Resource Identifier (URI): Generic Syntax,* 路径段 * 中仅允许使用以下字符
0
-9
路径本身允许X1 M2,N1 X作为段分隔符。
其他任何内容 * 必须 * 用百分比编码。