Ruby:用十六进制表示替换ascii范围中的某些字符

时间:2011-04-28 03:53:10

标签: ruby ascii hex

我需要更换某些ascii字符,例如@和&用它们的十六进制表示形式的URL分别为40和26。

我怎样才能在红宝石中做到这一点?还有一些最显着的字符' - ',不需要替换。

4 个答案:

答案 0 :(得分:1)

require 'uri'
URI.escape str, /[@&]/

显然,您可以使用更多要逃避的字符来扩展正则表达式。或者,如果你想进行白名单方法,你可以这么做,

URI.escape str, /[^-\w]/

答案 1 :(得分:1)

这是红宝石,所以有20种不同的方法可以做到这一点。这是我的:

>> a = 'one&two%three'                                                  
=> "one&two%three"                                                      
>> a.gsub(/[&%]/, '&' => '&'.ord, '%' => '%'.ord)                       
=> "one38two37three"  

答案 2 :(得分:0)

我非常确定Ruby内置了URL功能。但是,如果您想要定义一些更通用的翻译工具,可以使用如下代码:

s = "h@llo world"
t = { " " => "%20", "@" => "%40" };
puts s.split(//).map { |c| t[c] || c }.join

哪个会输出

h%40llo%20world

在上面的代码中,t是一个哈希,用于定义从特定字符到其表示的映射。字符串被分成字符,并且搜索每个字符等价的哈希值。

答案 3 :(得分:0)

更通用,更轻松:

require 'uri'
URI.escape(your_string,Regexp.new("[^#{URI::PATTERN::UNRESERVED}]")