Portál AbcLinuxu, 12. května 2025 10:10

Dotaz: Ruby, iconv, utf8 --> ascii

5.4.2007 15:12 daeltar | skóre: 13 | blog:
Ruby, iconv, utf8 --> ascii
Přečteno: 1358×
Odpovědět | Admin
Hezky den, nejprve dve ukazky stejneho kodu, jednou spusteno primo ruby, program napsan na STDIN a pomoci CTR+D vykonan ==> dostaneme jako vysledek po konverzi haldu otazniku:
[daeltar@rory ~]$ ruby
require 'iconv'
puts Iconv.new('ascii//translit', 'utf-8').iconv("čšřáýíěčš")
?????????
podruhe pomoci interaktivniho ruby, dostaneme ocekavany vysledek(tj odstraneni diakritiky):
[daeltar@rory ~]$ irb
irb(main):001:0> require 'iconv'
=> true
irb(main):002:0> puts Iconv.new('ascii//translit', 'utf-8').iconv("čšřáýíěčš")
csrayiecs
=> nil
A ja se ptam, proc? (locale cs_CZ.utf8, GNOME terminal, $KCODE nepomaha)
Nástroje: Začni sledovat (1) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

regnarg avatar 10.4.2007 16:02 regnarg | skóre: 20 | blog: rm -rf /this/blog
Rozbalit Rozbalit vše Re: Ruby, iconv, utf8 --> ascii
Odpovědět | | Sbalit | Link | Blokovat | Admin
Já jsem dopadl stejně i s irb:
irb(main):005:0> require 'iconv'
=> true
irb(main):006:0> puts Iconv.new('ascii//translit', 'utf-8').iconv("čšřáýíěčš")
?????????
=> nil

Gnome-terminal, cs_CZ.UTF-8
S láskou se nerodíme, ale s láskou se stáváme lidmi. --Simone De Beauvoirová
24.4.2007 21:42 daeltar | skóre: 13 | blog:
Rozbalit Rozbalit vše Re: Ruby, iconv, utf8 --> ascii
Odpovědět | | Sbalit | Link | Blokovat | Admin
Trošku si s tím zase hraji, potřebuji to používat v Ruby on Railsové appse. Zcela nedeterministicky to(v rámci té appsy, tj. mongrel + rails) funguje a někdy ne.

Napadá někoho nějaký workaround, kudy z toho ven?
26.8.2009 16:11 Jan Molič
Rozbalit Rozbalit vše Re: Ruby, iconv, utf8 --> ascii
Odpovědět | | Sbalit | Link | Blokovat | Admin
Problém je ve funkci setlocale. Iconv vyžaduje LC_CTYPE nastavené na něco jiného než C nebo POSIX (jinak dělá ty otazníky). Ruby setlocale po startu nevolá a ani není možnost to udělat ručně, protože to prý může ovlivnit printf() apod., čímž by skripty přestaly být přenositelné.

Řešením je nainstalovat rozšíření ruby-locale, které možnost volat setlocale přidá a pak ho použít takto:
require 'iconv'
require 'locale'

Locale::setlocale( Locale::LC_CTYPE, '' )

puts Iconv.new('ascii//translit', 'utf-8').iconv('šěčřšěž')

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.