我如何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根据...
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)
现在,您应该使用ERB::Util.url_encode
或CGI.escape
。它们之间的主要区别在于它们对空间的处理:
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"
您可以为此使用Addressable::URI
宝石:
我创建了一个gem,使URI编码的内容更干净,可以在您的代码中使用。它会为您处理二进制编码。
代码:
我本来是试图从完整的URL字符串中仅对文件名而不是路径中的特殊字符进行转义。
[如果您想“编码”完整的URL而不必考虑手动将其拆分为不同的部分,我发现以下内容的工作方式与以前使用URI.encode
的方式相同: