为什么不解码URI(“a”b”)==“a b”?

发布于 2024-10-09 09:39:13 字数 575 浏览 8 评论 0原文

我正在尝试用 Ruby 对 URL 进行编码,然后用 Javascript 对其进行解码。然而,加号字符给了我奇怪的行为。

在 Ruby 中:

[Dev]> CGI.escape "a b"
=> "a+b"
[Dev]> CGI.unescape "a+b"
=> "a b"

到目前为止一切顺利。但是 JavaScript 呢?

>>> encodeURI("a b")
"a%20b"
>>> decodeURI("a+b")
"a+b"

基本上我需要一种在 Javascript 和 Ruby 中以相同方式工作的 URL 编码/解码方法。

编辑: decodeURIComponent 也好不到哪儿去:

>>> encodeURIComponent("a b")
"a%20b"
>>> decodeURIComponent("a+b")
"a+b"

I'm trying to encode URLs in Ruby and decode them with Javascript. However, the plus character is giving me weird behavior.

In Ruby:

[Dev]> CGI.escape "a b"
=> "a+b"
[Dev]> CGI.unescape "a+b"
=> "a b"

So far so good. But what about Javascript?

>>> encodeURI("a b")
"a%20b"
>>> decodeURI("a+b")
"a+b"

Basically I need a method of encoding / decoding URLs that works the same way in Javascript and Ruby.

Edit: decodeURIComponent is no better:

>>> encodeURIComponent("a b")
"a%20b"
>>> decodeURIComponent("a+b")
"a+b"

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

枫以 2024-10-16 09:39:13

+ 不被视为空格。一种解决方法是将 + 替换为 %20,然后调用 decodeURIComponent

取自 php.js' url 解码

decodeURIComponent((str+'').replace(/\+/g, '%20'));

+ is not considered a space. One workaround is to replace + with %20 and then call decodeURIComponent

Taken from php.js' urldecode:

decodeURIComponent((str+'').replace(/\+/g, '%20'));
も星光 2024-10-16 09:39:13

来自 MDC 解码URI:

不解码不能由encodeURI引入的转义序列。

来自 MDC 编码URI:

请注意,encodeURI 本身无法形成正确的 HTTP GET 和 POST 请求,例如 XMLHTTPRequests,因为“&”、“+”和“= 未编码

From MDC decodeURI:

Does not decode escape sequences that could not have been introduced by encodeURI.

From MDC encodeURI:

Note that encodeURI by itself cannot form proper HTTP GET and POST requests, such as for XMLHTTPRequests, because "&", "+", and "=" are not encoded

债姬 2024-10-16 09:39:13

您可能想查看 URI.encodeURI.decode

require 'uri'

URI.encode('a + b') # => "a%20+%20b"
URI.decode('a%20+%20b') # => "a + b"

我经常使用的替代方案是 Addressable::URI

require 'addressable/uri'
Addressable::URI.encode('a + b') #=> "a%20+%20b"
Addressable::URI.unencode('a%20+%20b') #=> "a + b"

You might want to look at URI.encode and URI.decode:

require 'uri'

URI.encode('a + b') # => "a%20+%20b"
URI.decode('a%20+%20b') # => "a + b"

An alternate, that I use a lot, is Addressable::URI:

require 'addressable/uri'
Addressable::URI.encode('a + b') #=> "a%20+%20b"
Addressable::URI.unencode('a%20+%20b') #=> "a + b"
挖个坑埋了你 2024-10-16 09:39:13

如果您使用 php urlencode,那么当通过 XMLHttpRequest 从 php 发送响应时,您也会遇到 a+b 相同的问题。要解决这个问题,你必须使用 php rawurlencode 函数。

由于某种原因,从 XMLHttpRequest 到 php urldecode 工作正常。

You also get the same problem of a+b when sending a response from php via XMLHttpRequest if you use php urlencode. To solve it you have to use the php rawurlencode function.

From XMLHttpRequest to php urldecode works fine for some reason.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文