# Un-escaping hexadecimal code

**URL:** <https://www.ruby-forum.com/t/un-escaping-hexadecimal-code/160886>\
**Category:** Ruby\
**Created:** [February 20, 2009, 5:05pm UTC](https://www.ruby-forum.com/t/un-escaping-hexadecimal-code/160886 "2009-02-20T17:05:19Z")\
**Posts on this page:** 9\
**Page:** 1

<div class="post-metadata">

**Author:** ![ISSSSaki\_Baz\_C](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/i/51bf81/32.png) [@ISSSSaki\_Baz\_C](https://www.ruby-forum.com/u/ISSSSaki_Baz_C)\
**Post date:** [February 20, 2009, 5:05pm UTC](https://www.ruby-forum.com/t/un-escaping-hexadecimal-code/160886/1 "2009-02-20T17:05:19Z")

</div>

Hi, I receive a String allowing hexadecimal escaping by using %XX  
syntax:

%61lice =\> alice ( %61 == a )

I would like to un-escape the string. I’ve got it using “eval” but I’d  
prefer  
avoiding using “eval”:

string = “%61lice”  
string = eval %{ “#{ string.gsub(/%/,’\x’) }” }  
=\> “alice”

How could I avoid the usage of “eval” to un-escape the string?

Thanks a lot.

---

<div class="post-metadata">

**Author:** ![ISSSSaki\_Baz\_C](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/i/51bf81/32.png) [@ISSSSaki\_Baz\_C](https://www.ruby-forum.com/u/ISSSSaki_Baz_C)\
**Post date:** [February 20, 2009, 5:09pm UTC](https://www.ruby-forum.com/t/un-escaping-hexadecimal-code/160886/2 "2009-02-20T17:09:26Z")

</div>

El Viernes, 20 de Febrero de 2009, IÃ±aki Baz C. escribiÃ³:

> How could I avoid the usage of “eval” to un-escape the string?

Ops, it is easier than above. CGI lib already does it:

require ‘cgi’  
CGI.unescape("%61lice")  
=\> “alice”

🙂

---

<div class="post-metadata">

**Author:** ![ISSSSaki\_Baz\_C](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/i/51bf81/32.png) [@ISSSSaki\_Baz\_C](https://www.ruby-forum.com/u/ISSSSaki_Baz_C)\
**Post date:** [February 20, 2009, 5:20pm UTC](https://www.ruby-forum.com/t/un-escaping-hexadecimal-code/160886/3 "2009-02-20T17:20:52Z")

</div>

IÃ±aki Baz C. wrote:

> string = “%61lice”  
> string = eval %{ “#{ string.gsub(/%/,’\x’) }” }  
> =\> “alice”
> 
> How could I avoid the usage of “eval” to un-escape the string?

s.gsub! /%(\d+)/ do |match|  
$1.to\_i(16).chr  
end  
puts s

You might also consider supporting escaped % literals.

---

<div class="post-metadata">

**Author:** ![ISSSSaki\_Baz\_C](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/i/51bf81/32.png) [@ISSSSaki\_Baz\_C](https://www.ruby-forum.com/u/ISSSSaki_Baz_C)\
**Post date:** [February 20, 2009, 5:38pm UTC](https://www.ruby-forum.com/t/un-escaping-hexadecimal-code/160886/4 "2009-02-20T17:38:36Z")

</div>

El Viernes, 20 de Febrero de 2009, Jeff S. escribiÃ³:

> puts s
> 
> You might also consider supporting escaped % literals.

It fails since it should be:

s.gsub! /%(\d\d)/ do |match|  
$1.to\_i(16).chr  
end

Without this change it would fail when matching:

“%61123”

But fixing it then it works well, thanks a lot 🙂

---

<div class="post-metadata">

**Author:** ![ISSSSaki\_Baz\_C](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/i/51bf81/32.png) [@ISSSSaki\_Baz\_C](https://www.ruby-forum.com/u/ISSSSaki_Baz_C)\
**Post date:** [February 20, 2009, 6:28pm UTC](https://www.ruby-forum.com/t/un-escaping-hexadecimal-code/160886/5 "2009-02-20T18:28:09Z")

</div>

IÃ±aki Baz C. wrote:

> > puts s
> > 
> > You might also consider supporting escaped % literals.
> 
> Also, it should consider not just number but A-F

Right you are.

---

<div class="post-metadata">

**Author:** ![ISSSSaki\_Baz\_C](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/i/51bf81/32.png) [@ISSSSaki\_Baz\_C](https://www.ruby-forum.com/u/ISSSSaki_Baz_C)\
**Post date:** [February 20, 2009, 5:39pm UTC](https://www.ruby-forum.com/t/un-escaping-hexadecimal-code/160886/6 "2009-02-20T17:39:47Z")

</div>

El Viernes, 20 de Febrero de 2009, Jeff S. escribiÃ³:

> puts s
> 
> You might also consider supporting escaped % literals.

Also, it should consider not just number but A-F

---

<div class="post-metadata">

**Author:** ![ISSSSaki\_Baz\_C](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/i/51bf81/32.png) [@ISSSSaki\_Baz\_C](https://www.ruby-forum.com/u/ISSSSaki_Baz_C)\
**Post date:** [February 20, 2009, 7:28pm UTC](https://www.ruby-forum.com/t/un-escaping-hexadecimal-code/160886/7 "2009-02-20T19:28:44Z")

</div>

IÃ±aki Baz C. wrote:

> El Viernes, 20 de Febrero de 2009, Jeff S. escribiÃ³:
> 
> > puts s
> > 
> > You might also consider supporting escaped % literals.
> 
> Also, it should consider not just number but A-F

s = “%4Flice”  
s.gsub! /%([\da-fA-F][\da-fA-F])/ { $1.to\_i(16).chr }  
puts s

---

<div class="post-metadata">

**Author:** ![ISSSSaki\_Baz\_C](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/i/51bf81/32.png) [@ISSSSaki\_Baz\_C](https://www.ruby-forum.com/u/ISSSSaki_Baz_C)\
**Post date:** [February 20, 2009, 8:00pm UTC](https://www.ruby-forum.com/t/un-escaping-hexadecimal-code/160886/8 "2009-02-20T20:00:44Z")

</div>

Igor P. wrote:

> IÃ±aki Baz C. wrote:
> 
> > El Viernes, 20 de Febrero de 2009, Jeff S. escribiÃ³:
> > 
> > > puts s
> > > 
> > > You might also consider supporting escaped % literals.  
> > > Also, it should consider not just number but A-F
> 
> s = “%4Flice”  
> s.gsub! /%([\da-fA-F][\da-fA-F])/ { $1.to\_i(16).chr }  
> puts s

SyntaxError: compile error  
(irb):2: syntax error, unexpected ‘{’, expecting $end  
s.gsub! /%([\da-fA-F][\da-fA-F])/ { $1.to\_i(16).chr }  
^

---

<div class="post-metadata">

**Author:** ![ISSSSaki\_Baz\_C](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/i/51bf81/32.png) [@ISSSSaki\_Baz\_C](https://www.ruby-forum.com/u/ISSSSaki_Baz_C)\
**Post date:** [February 20, 2009, 8:32pm UTC](https://www.ruby-forum.com/t/un-escaping-hexadecimal-code/160886/9 "2009-02-20T20:32:45Z")

</div>

Jeff S. wrote:

> SyntaxError: compile error  
> (irb):2: syntax error, unexpected ‘{’, expecting $end  
> s.gsub! /%([\da-fA-F][\da-fA-F])/ { $1.to\_i(16).chr }  
> ^

Sorry, in Ruby 1.9 this is no longer a Syntax Error
