# A question about Iconv arguments

**URL:** <https://www.ruby-forum.com/t/a-question-about-iconv-arguments/106398>\
**Category:** Ruby\
**Created:** [June 9, 2007, 9:12pm UTC](https://www.ruby-forum.com/t/a-question-about-iconv-arguments/106398 "2007-06-09T21:12:37Z")\
**Posts on this page:** 7\
**Page:** 1

<div class="post-metadata">

**Author:** ![Axel\_E](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/7c8e57/32.png) [@Axel\_E](https://www.ruby-forum.com/u/Axel_E)\
**Post date:** [June 9, 2007, 9:12pm UTC](https://www.ruby-forum.com/t/a-question-about-iconv-arguments/106398/1 "2007-06-09T21:12:37Z")

</div>

Dear all,

I need to convert some accented text, and I would like to know  
what arguments I have to give Iconv to produce the desired output.  
E.g., in Italian, the word for Friday is “venerdi”, where the  
“i” carries a dash (small i with grave accent).  
If you type this into Wikipedia search in Italian  
(which I believed to be in utf-8 encoding),  
it will load:

[Venerdì - Wikipedia](http://it.wikipedia.org/wiki/Venerd%c3%ac) ,

yet this syntax:

converted\_doc = Iconv.new(output\_encoding, input\_encoding).iconv(doc)

gives me “venerd\303\254” when I convert from latin1 encoding.

What arguments do I have to use ?

Thank you,

Best regards,

Axel

---

<div class="post-metadata">

**Author:** ![Axel\_E](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/7c8e57/32.png) [@Axel\_E](https://www.ruby-forum.com/u/Axel_E)\
**Post date:** [June 10, 2007, 12:35am UTC](https://www.ruby-forum.com/t/a-question-about-iconv-arguments/106398/2 "2007-06-10T00:35:02Z")

</div>

Axel E. wrote:

> [Venerdì - Wikipedia](http://it.wikipedia.org/wiki/Venerd%c3%ac) ,
> 
> yet this syntax:
> 
> converted\_doc = Iconv.new(output\_encoding, input\_encoding).iconv(doc)
> 
> gives me “venerd\303\254” when I convert from latin1 encoding.  
> That looks right to me - if I write that into a UTF-8 HTML document, it  
> displays correctly. What are you expecting?

---

<div class="post-metadata">

**Author:** ![Axel\_E](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/7c8e57/32.png) [@Axel\_E](https://www.ruby-forum.com/u/Axel_E)\
**Post date:** [June 10, 2007, 9:52am UTC](https://www.ruby-forum.com/t/a-question-about-iconv-arguments/106398/3 "2007-06-10T09:52:47Z")

</div>

Dear Alex,

thank you for responding.  
If I try to get a webpage that has accents in its address,  
like

> require “rubygems”  
> require “rio”  
> require ‘iconv’  
> output\_encoding = ‘utf-8’  
> doc=“Venerdì”  
> converted\_doc = Iconv.new(output\_encoding, ‘latin1’).iconv(doc)  
> rio(“[Wikipedia, the free encyclopedia](http://www.wikipedia.org/wiki/)” + converted\_doc)\>rio(“a.html”)

I get an error message:

/usr/local/lib/ruby/1.8/uri/common.rb:436:in `split': bad URI(is not URI?): http://www.wikipedia.org/wiki/venerdÃ¬ (URI::InvalidURIError) from /usr/local/lib/ruby/1.8/uri/common.rb:485:in `parse’  
from  
/usr/local/lib/ruby/gems/1.8/gems/rio-0.4.0/lib/rio/rl/withpath.rb:285:in  
`uri_from_string_' from /usr/local/lib/ruby/gems/1.8/gems/rio-0.4.0/lib/rio/rl/uri.rb:74:in `arg0\_info\_’  
from  
/usr/local/lib/ruby/gems/1.8/gems/rio-0.4.0/lib/rio/rl/uri.rb:83:in  
`init_from_args_' from /usr/local/lib/ruby/gems/1.8/gems/rio-0.4.0/lib/rio/rl/uri.rb:56:in `initialize’  
from  
/usr/local/lib/ruby/gems/1.8/gems/rio-0.4.0/lib/rio/rl/base.rb:80:in  
`new' from /usr/local/lib/ruby/gems/1.8/gems/rio-0.4.0/lib/rio/rl/base.rb:80:in `parse’  
from  
/usr/local/lib/ruby/gems/1.8/gems/rio-0.4.0/lib/rio/rl/builder.rb:111:in  
`build' from /usr/local/lib/ruby/gems/1.8/gems/rio-0.4.0/lib/rio/factory.rb:412:in `create\_state’  
from /usr/local/lib/ruby/gems/1.8/gems/rio-0.4.0/lib/rio.rb:65:in  
`initialize' from /usr/local/lib/ruby/gems/1.8/gems/rio-0.4.0/lib/rio.rb:76:in `new’  
from /usr/local/lib/ruby/gems/1.8/gems/rio-0.4.0/lib/rio.rb:76:in  
`rio' from /usr/local/lib/ruby/gems/1.8/gems/rio-0.4.0/lib/rio/kernel.rb:42:in `rio’

This doesn’t happen if I type in:

rio(“[http://www.wikipedia.org/wiki/Venerdì")\>rio("a.html](http://www.wikipedia.org/wiki/Venerd%C3%AC%22)%3Erio(%22a.html)”)

So I need to know what conversion arguments I need to give Iconv to  
turn “Venerdì” into “Venerd%C3%AC”.

Best regards,

Axel

---

<div class="post-metadata">

**Author:** ![Axel\_E](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/7c8e57/32.png) [@Axel\_E](https://www.ruby-forum.com/u/Axel_E)\
**Post date:** [June 10, 2007, 11:06am UTC](https://www.ruby-forum.com/t/a-question-about-iconv-arguments/106398/4 "2007-06-10T11:06:51Z")

</div>

I’ve managed to solve this problem like this:

require “rubygems”  
require “rio”  
require ‘iconv’

def to\_hex(number)  
number=number.abs  
binary=‘’  
while number\>0  
digit=number%16  
if digit\<10  
binary\<\<digit.to\_s  
elsif digit==10  
binary\<\<‘A%’  
elsif digit==11  
binary\<\<‘B%’  
elsif digit==12  
binary\<\<‘C%’  
elsif digit==13  
binary\<\<‘D%’  
elsif digit==14  
binary\<\<‘E%’  
elsif digit==15  
binary\<\<‘F%’  
end  
number=(number-digit)/16  
end  
return binary.reverse.gsub(/%([A-F])%([A-F])/,‘%\1\2’)  
end

class String  
def wiki\_addr  
converted\_doc = Iconv.new(‘utf-8’, ‘latin1’).iconv(self)  
res=‘’  
converted\_doc.split(//).each{|x|  
if /[a-zA-Z0-9\_]/.match(x)  
res\<\<x  
else  
res\<\<to\_hex(x[0])  
end  
}  
return res  
end  
end

doc  
="venerdì"doc.wiki\_addr  
rio(“[Wikipedia, l'enciclopedia libera](http://it.wikipedia.org/wiki/)”+ doc.wiki\_addr)\>rio(“a.html”)

Best regards,

Axel

---

<div class="post-metadata">

**Author:** ![Axel\_E](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/7c8e57/32.png) [@Axel\_E](https://www.ruby-forum.com/u/Axel_E)\
**Post date:** [June 10, 2007, 8:54pm UTC](https://www.ruby-forum.com/t/a-question-about-iconv-arguments/106398/5 "2007-06-10T20:54:57Z")

</div>

Dear Stefan,

thank you for bringing this to notice!  
(Slightly varying Voltaire, I might  
have been able to write a shorter  
program had I had more leisure and  
more knowledge).  
I’ll try your suggestion.  
Best regards,

Axel

---

<div class="post-metadata">

**Author:** ![Axel\_E](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/7c8e57/32.png) [@Axel\_E](https://www.ruby-forum.com/u/Axel_E)\
**Post date:** [June 11, 2007, 6:47am UTC](https://www.ruby-forum.com/t/a-question-about-iconv-arguments/106398/6 "2007-06-11T06:47:50Z")

</div>

Hi,

At Sun, 10 Jun 2007 18:05:49 +0900,  
Axel E. wrote in [ruby-talk:254981]:

> I’ve managed to solve this problem like this:

$ ruby -riconv -rcgi -e ‘puts CGI.escape(Iconv.conv(“utf-8”, “latin1”,  
“venerd\354”))’  
venerd%C3%AC

---

<div class="post-metadata">

**Author:** ![Axel\_E](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/7c8e57/32.png) [@Axel\_E](https://www.ruby-forum.com/u/Axel_E)\
**Post date:** [June 10, 2007, 6:37pm UTC](https://www.ruby-forum.com/t/a-question-about-iconv-arguments/106398/7 "2007-06-10T18:37:05Z")

</div>

Axel E. wrote:

> I’ve managed to solve this problem like this:
> 
> require “rubygems”  
> require “rio”  
> require ‘iconv’
> 
> def to\_hex(number)  
> number=number.abs  
> binary=’’  
> while number\>0  
> digit=number%16  
> if digit\<10  
> binary\<\<digit.to\_s  
> elsif digit==10  
> …

I guess you’re not aware of neither:  
1234.to\_s(16)  
nor:  
“%x” % 1234

For situations like the above, even a lookup-array or a case/when would  
be better.

Regards  
Stefan
