2

这是我的输出:

URI.encode("http://localhost:3000/membership?referer_invite_code=a03478&fee=UVYA")
=> "http://localhost:3000/membership?referer_invite_code=a03478&fee=UVYA" 

But I need output to be:
=> "http%3A%2F%2Flocalhost%3A3000..."

原因是因为我正在尝试做一个嵌入式 twitter 链接,而 twitter 不能很好地处理与号,所以只要编码不替换&最后一个费用参数,%26它就不会起作用。我该如何解决?

工作解决方案

Rack::Utils.escape("http://localhost:3000/membership?referer_invite_code=a03478&fee=UVYA")

但我想我只是好奇为什么URI.encode没有工作

4

2 回答 2

2

您应该URI.encode_www_form_component为此目的使用:

URI.encode_www_form_component "http://localhost:3000/membership?referer_invite_code=a03478&fee=UVYA"
=> "http%3A%2F%2Flocalhost%3A3000%2Fmembership%3Freferer_invite_code%3Da03478%26fee%3DUVYA"

这似乎URI.encode是为了对整个 URI进行编码以用作 URI,而不是用作 URI 中的参数。它只是为了防止在 URI 中使用非法字符——而不是正确编码 URI 参数——所以默认情况下它不对此处列出的保留字符进行编码。

您可以在URI::Escape 的 RubyDoc 条目中找到更多信息。URI.escape将可选的正则表达式作为第二个参数。正则表达式指定应在结果中对哪些字符进行百分比编码。如果省略,URI::UNSAFE则使用默认值 of。在 MRI 2.3.1 中,这相当于以下内容:

/[^\-_.!~*'()a-zA-Z\d;\/?:@&=+$,\[\]]/

如您所见,这不会匹配 URI 的任何保留字符。它将做的是保护您免于构建和使用非法的 URI。例如:

URI.encode "https://test.com"
=> "https://test.com"

URI.encode "https://testçĕÅ.com/"
=> "https://test%C3%A7%C4%95%C3%85.com/"
于 2017-10-20T19:36:37.397 回答
0

我猜你之前忘记了

require 'uri'
于 2016-06-16T11:26:17.910 回答