如何在Ruby中对字符串进行URL编码

问题描述 投票:132回答:8

我如何URI::encode这样的字符串:

\x12\x34\x56\x78\x9a\xbc\xde\xf1\x23\x45\x67\x89\xab\xcd\xef\x12\x34\x56\x78\x9a

以类似格式获取它:

%124Vx%9A%BC%DE%F1%23Eg%89%AB%CD%EF%124Vx%9A

根据RFC 1738?

这是我尝试过的:

irb(main):123:0> URI::encode "\x12\x34\x56\x78\x9a\xbc\xde\xf1\x23\x45\x67\x89\xab\xcd\xef\x12\x34\x56\x78\x9a"
ArgumentError: invalid byte sequence in UTF-8
    from /usr/local/lib/ruby/1.9.1/uri/common.rb:219:in `gsub'
    from /usr/local/lib/ruby/1.9.1/uri/common.rb:219:in `escape'
    from /usr/local/lib/ruby/1.9.1/uri/common.rb:505:in `escape'
    from (irb):123
    from /usr/local/bin/irb:12:in `<main>'

也:

irb(main):126:0> CGI::escape "\x12\x34\x56\x78\x9a\xbc\xde\xf1\x23\x45\x67\x89\xab\xcd\xef\x12\x34\x56\x78\x9a"
ArgumentError: invalid byte sequence in UTF-8
    from /usr/local/lib/ruby/1.9.1/cgi/util.rb:7:in `gsub'
    from /usr/local/lib/ruby/1.9.1/cgi/util.rb:7:in `escape'
    from (irb):126
    from /usr/local/bin/irb:12:in `<main>'

尽管我几乎肯定地有一天我做到了这一点而没有任何麻烦。

我如何URI ::编码如下字符串:\ x12 \ x34 \ x56 \ x78 \ x9a \ xbc \ xde \ xf1 \ x23 \ x45 \ x67 \ x89 \ xab \ xcd \ xef \ x12 \ x34 \ x56 \ x78 \ x9a的格式如下:%124Vx%9A%BC%DE%F1%23Eg%89%AB%CD%EF%124Vx%9A根据...

ruby-on-rails ruby string uri urlencode
8个回答
174
投票
require 'uri'
str = "\x12\x34\x56\x78\x9a\xbc\xde\xf1\x23\x45\x67\x89\xab\xcd\xef\x12\x34\x56\x78\x9a".force_encoding('ASCII-8BIT')
puts URI::encode(str)

74
投票

现在,您应该使用ERB::Util.url_encodeCGI.escape。它们之间的主要区别在于它们对空间的处理:


70
投票
str = "\x12\x34\x56\x78\x9a\xbc\xde\xf1\x23\x45\x67\x89\xab\xcd\xef\x12\x34\x56\x78\x9a"
require 'cgi'
CGI.escape(str)
# => "%124Vx%9A%BC%DE%F1%23Eg%89%AB%CD%EF%124Vx%9A"

9
投票

您可以为此使用Addressable::URI宝石:


5
投票

我创建了一个gem,使URI编码的内容更干净,可以在您的代码中使用。它会为您处理二进制编码。


2
投票

代码:


2
投票

我本来是试图从完整的URL字符串中仅对文件名而不是路径中的特殊字符进行转义。


0
投票

[如果您想“编码”完整的URL而不必考虑手动将其拆分为不同的部分,我发现以下内容的工作方式与以前使用URI.encode的方式相同:

© www.soinside.com 2019 - 2024. All rights reserved.