Internet Info, s.r.o. Lupa Měšec Podnikatel Root Zdroják DigiZone Slunečnice Vitalia TopDrive KupDnes Navrcholu NovýTarif Dobrý web Weblogy Woko Jagg Computer.cz SK: MojeLinky

Hlavní navigace

Ruby a unicode: bratři nebo nepřátelé?

Unicode je jedna z nejdůležitějších dnešních technologií, přesto je jeho podpora v Ruby stejně jako v mnoha dalších programovacích jazycích problematická. Pomoc však existuje, možností pomoci je dokonce více. Jak tedy nepodporu unicode elegantně vyřešit?

Tweetni to Twitter Jaggni to! Jagg Del.icio.us Delicious

Co je míněno podporou unicode?

Když říkám, že Ruby neumí unicode, ani v nejmenším to neznamená, že nemůžete psát své skripty v UTF-8, UTF-16 nebo podobném kódování, s tím samozřejmě problém není. Problém je v tom, že string v Ruby je implementovaný jako sekvence bytů bez ohledu na délku znaku. Důsledkem toho nefungují správně metody jako například length, reverse, upcase, each_char a podobné.

Řešení?

Hackujeme přes regulární výrazy

Pointa jednoho z možných způsobů řešení spočívá v tom, že regulární výrazy unicode de facto podporují, jenom je třeba jim pomoci, aby si to „uvědomily“. Od toho slouží přepínač u. Ukázka napoví více:

# špatně - bez přepínače "u"
"čeština".gsub(/./, '\& ').each { |match| puts match }
=> ? ? e ? ? t i n a

# správně - s přepínačem "u"
"čeština".gsub(/./u, '\& ').each { |match| puts match }
=> č e š t i n a

Užitečné, že? Pokud se vám parametr „ u“ nechce u každého regulárního výrazu uvádět, je možné jej nastavit globálně pomocí proměnné $KCODE:

$KCODE = "u"

"čeština".gsub(/./, '\& ').each { |match| puts match }
=> č e š t i n a

To je sice hezké a bezesporu také velmi užitečné, ale naši potřebu fungujících metod reverse a podobně to neřeší. Budeme si muset pomoci sami, ale nebojte, není to těžké – stačí prostě předefinovat metodu reverse:

$KCODE = "u"

class String

  def reverse
    self.scan(/./).reverse.join
  end

end

Nyní bude metoda reverse fungovat bezproblémově. Stejným způsobem lze velmi snadno a přitom maximálně elegantně předefinovat další metody jako například first, last nebo length a na několika málo řádcích změnit chování Ruby tak, že po načtení této vaší knihovny již nebude k poznání, že Ruby vůbec někdy unicode nepodporovalo. To je důsledek čistého objektového návrhu.

Sluší se poznamenat, že binárka Ruby umožňuje použití parametru -Ku (resp. parametru -K s volbou u), který umožňuje nastavení proměnné $KCODE při spouštění programu bez přímého zásahu do něj.

Tímto způsobem je možno předefinovat i ostatní metody Stringu:

$KCODE = "u"

class String

  def reverse
    self.scan(/./).reverse.join
  end

  def first
    self.scan(/^./).join
  end

  def last
    self.scan(/.$/).join
  end

  def length
    self.scan(/./).length
  end

  ...

end

Problémy

Pokud bychom chtěli opravdu důkladnou podporu unicode, bylo by patrně též záhodno předefinovat pár metod třídy Range, protože ("a".."z") bude samozřejmě zacházet pouze s ASCII sadou. Je ovšem otázka, zda je moudré něco takového dělat a když už, tak alespoň musíme brát ohled na systémové locales. Pokud bychom chtěli, aby správně fungovalo porovnávání, bylo by též třeba předefinovat metodu <=> z modulu Comparable.

TIB2012

       

Nejsem si příliš jistý ohledně metod upcase, downcase a swapcase. Osobně používám metodu tr, ale to předpokládá vypsání všech unicode znaků jako její parametr. Pro ty české to samozřejmě není problém, ale obecné řešení to není. Pokud někdo máte lepší řešení, budu rád, když se podělíte v diskusi.

Příště

V příštím díle se podíváme na různé knihovny, které nám při naší práci s unicode mohou přijít vhod – unicode, ICU4R a z Ruby on Rails známý ActiveSupport::Multibyte. Řeč přijde též na podporu unicode v chystaném Ruby 1.9.1 a dozvíte se také, jak podporují unicode ostatní implementace Ruby, především JRuby.

Odkazy

Jakub Šťastný

Jakub Šťastný

Jakub Šťastný byl v letech 2007 až 2008 redaktorem serveru Root.cz. Mezi jeho zájmy patří Linux, programování a typografický systém TeX.

Školení: TCP/IP na Linuxu I.

V tomto kurzu se seznámíte se síťováním v Linuxu na všech vrstvách. Ujasníte si možnosti použití Linuxu v roli klienta, serveru i routeru.

  • Počítačové sítě
  • Architektura TCP/IP
  • Ethernet
  • Protokol PPP
  • Protokoly IPv4 a IPv6
  • IP na ethernetu
  • IP routing
  • Chybové a řídící zprávy
  • Transportní protokoly
  • Překlady jmen a adres
  • Aplikace
  • Překlady síťových adres a proxying
  • Testování sítě
  • Aktuální situace na poli TCP/IP

Podrobnější informace a přihláška  

Ohodnoťte jako ve škole:
Průměrná známka 2,98

Přehled názorů

Dalsi vidani
anonymní uživatel 29. 10. 2007 00:58
Nový
Co to vůbec je "dobře implementované Unicode"?
anonymní uživatel 29. 10. 2007 03:37
Nový
├ 
Re: Co to vůbec je "dobře implementované Unicode"?
LO 29. 10. 2007 05:22
Nový
│
├ 
Re: Co to vůbec je "dobře implementované Unicode"?
Rejpal 29. 10. 2007 06:24
Nový
│
│
├ 
Re: Co to vůbec je "dobře implementované Unicode"?
Pavel Sýkora 29. 10. 2007 09:08
Nový
│
│
│
├ 
Re: Co to vůbec je "dobře implementované Unicode"?
anonymní uživatel 29. 10. 2007 10:10
Nový
│
│
│
│
├ 
Re: Co to vůbec je "dobře implementované Unicode"?
Miloslav Ponkrác 29. 10. 2007 10:22
Nový
│
│
│
│
│
├ 
Re: Co to vůbec je "dobře implementované Unicode"?
anonymní uživatel 29. 10. 2007 10:42
Nový
│
│
│
│
│
└ 
Re: Co to vůbec je "dobře implementované Unicode"?
Jirka Kosek 29. 10. 2007 10:57
Nový
│
│
│
│
│
 
├ 
Re: Co to vůbec je "dobře implementované Unicode"?
anonymní uživatel 29. 10. 2007 11:49
Nový
│
│
│
│
│
 
│
└ 
Re: Co to vůbec je "dobře implementované Unicode"?
Jirka Kosek 29. 10. 2007 13:46
Nový
│
│
│
│
│
 
│
 
└ 
Re: Co to vůbec je "dobře implementované Unicode"?
anonymní uživatel 29. 10. 2007 15:45
Nový
│
│
│
│
│
 
│
 
 
└ 
Re: Co to vůbec je "dobře implementované Unicode"?
Jirka Kosek 29. 10. 2007 22:08
Nový
│
│
│
│
│
 
├ 
Re: Co to vůbec je "dobře implementované Unicode"?
Miloslav Ponkrác 29. 10. 2007 12:12
Nový
│
│
│
│
│
 
└ 
Re: Co to vůbec je "dobře implementované Unicode"?
anonymní uživatel 29. 10. 2007 15:15
Nový
│
│
│
│
│
 
 
├ 
Re: Co to vůbec je "dobře implementované Unicode"?
Miloslav Ponkrác 29. 10. 2007 15:35
Nový
│
│
│
│
│
 
 
│
├ 
Re: Co to vůbec je "dobře implementované Unicode"?
anonymní uživatel 29. 10. 2007 15:39
Nový
│
│
│
│
│
 
 
│
└ 
Re: Co to vůbec je "dobře implementované Unicode"?
anonymní uživatel 29. 10. 2007 15:43
Nový
│
│
│
│
│
 
 
│
 
└ 
Re: Co to vůbec je "dobře implementované Unicode"?
Jirka Kosek 29. 10. 2007 16:07
Nový
│
│
│
│
│
 
 
│
 
 
└ 
Re: Co to vůbec je "dobře implementované Unicode"?
anonymní uživatel 30. 10. 2007 10:56
Nový
│
│
│
│
│
 
 
└ 
Re: Co to vůbec je "dobře implementované Unicode"?
Jirka Kosek 29. 10. 2007 15:58
Nový
│
│
│
│
├ 
Re: Co to vůbec je "dobře implementované Unicode"?
Pavel Sýkora 29. 10. 2007 13:05
Nový
│
│
│
│
│
└ 
Re: Co to vůbec je "dobře implementované Unicode"?
anonymní uživatel 29. 10. 2007 13:16
Nový
│
│
│
│
│
 
├ 
Re: Co to vůbec je "dobře implementované Unicode"?
anonymní uživatel 29. 10. 2007 13:22
Nový
│
│
│
│
│
 
│
└ 
Re: Co to vůbec je "dobře implementované Unicode"?
anonymní uživatel 29. 10. 2007 15:29
Nový
│
│
│
│
│
 
│
 
└ 
Re: Co to vůbec je "dobře implementované Unicode"?
Miloslav Ponkrác 29. 10. 2007 15:41
Nový
│
│
│
│
│
 
└ 
Re: Co to vůbec je "dobře implementované Unicode"?
Miloslav Ponkrác 29. 10. 2007 13:25
Nový
│
│
│
│
│
 
 
├ 
Re: Co to vůbec je "dobře implementované Unicode"?
Pavel Sýkora 29. 10. 2007 14:40
Nový
│
│
│
│
│
 
 
│
└ 
Re: Co to vůbec je "dobře implementované Unicode"?
Miloslav Ponkrác 29. 10. 2007 15:08
Nový
│
│
│
│
│
 
 
├ 
Re: Co to vůbec je "dobře implementované Unicode"?
anonymní uživatel 29. 10. 2007 15:37
Nový
│
│
│
│
│
 
 
│
└ 
Re: Co to vůbec je "dobře implementované Unicode"?
Miloslav Ponkrác 29. 10. 2007 15:46
Nový
│
│
│
│
│
 
 
│
 
├ 
Re: Co to vůbec je "dobře implementované Unicode"?
Jirka Kosek 29. 10. 2007 16:23
Nový
│
│
│
│
│
 
 
│
 
│
└ 
Re: Co to vůbec je "dobře implementované Unicode"?
Miloslav Ponkrác 29. 10. 2007 20:53
Nový
│
│
│
│
│
 
 
│
 
│
 
└ 
Re: Co to vůbec je "dobře implementované Unicode"?
LO 29. 10. 2007 23:58
Nový
│
│
│
│
│
 
 
│
 
│
 
 
└ 
Re: Co to vůbec je "dobře implementované Unicode"?
Miloslav Ponkrác 30. 10. 2007 00:16
Nový
│
│
│
│
│
 
 
│
 
├ 
Re: Co to vůbec je "dobře implementované Unicode"?
LO 29. 10. 2007 17:19
Nový
│
│
│
│
│
 
 
│
 
└ 
Re: Co to vůbec je "dobře implementované Unicode"?
repulsive 29. 10. 2007 18:15
Nový
│
│
│
│
│
 
 
│
 
 
└ 
Re: Co to vůbec je "dobře implementované Unicode"?
repulsive 29. 10. 2007 21:37
Nový
│
│
│
│
│
 
 
├ 
Re: Co to vůbec je "dobře implementované Unicode"?
LO 29. 10. 2007 17:17
Nový
│
│
│
│
│
 
 
└ 
Re: Co to vůbec je "dobře implementované Unicode"?
Juraj DURECH 31. 10. 2007 16:12
Nový
│
│
│
│
│
 
 
 
└ 
Re: Co to vůbec je "dobře implementované Unicode"?
Juraj DURECH 31. 10. 2007 16:20
Nový
│
│
│
│
└ 
Re: Co to vůbec je "dobře implementované Unicode"?
anonymní uživatel 29. 10. 2007 17:09
Nový
│
│
│
│
 
└ 
Re: Co to vůbec je "dobře implementované Unicode"?
anonymní uživatel 29. 10. 2007 17:18
Nový
│
│
│
└ 
Re: Co to vůbec je "dobře implementované Unicode"?
Miloslav Ponkrác 29. 10. 2007 10:15
Nový
│
│
│
 
├ 
Re: Co to vůbec je "dobře implementované Unicode"?
anonymní uživatel 29. 10. 2007 10:33
Nový
│
│
│
 
├ 
Re: Co to vůbec je "dobře implementované Unicode"?
Ondrej 'SanTiago' Zajicek 29. 10. 2007 10:54
Nový
│
│
│
 
│
└ 
Re: Co to vůbec je "dobře implementované Unicode"?
Miloslav Ponkrác 29. 10. 2007 12:15
Nový
│
│
│
 
│
 
├ 
Re: Co to vůbec je "dobře implementované Unicode"?
Ondrej 'SanTiago' Zajicek 29. 10. 2007 12:25
Nový
│
│
│
 
│
 
│
└ 
Re: Co to vůbec je "dobře implementované Unicode"?
Miloslav Ponkrác 29. 10. 2007 12:56
Nový
│
│
│
 
│
 
│
 
├ 
Re: Co to vůbec je "dobře implementované Unicode"?
anonymní uživatel 29. 10. 2007 13:15
Nový
│
│
│
 
│
 
│
 
└ 
Re: Co to vůbec je "dobře implementované Unicode"?
Ondrej 'SanTiago' Zajicek 29. 10. 2007 13:28
Nový
│
│
│
 
│
 
│
 
 
├ 
Re: Co to vůbec je "dobře implementované Unicode"?
anonymní uživatel 29. 10. 2007 13:35
Nový
│
│
│
 
│
 
│
 
 
│
└ 
Re: Co to vůbec je "dobře implementované Unicode"?
Ondrej 'SanTiago' Zajicek 29. 10. 2007 13:45
Nový
│
│
│
 
│
 
│
 
 
│
 
└ 
Re: Co to vůbec je "dobře implementované Unicode"?
anonymní uživatel 29. 10. 2007 14:26
Nový
│
│
│
 
│
 
│
 
 
└ 
Re: Co to vůbec je "dobře implementované Unicode"?
Miloslav Ponkrác 29. 10. 2007 14:24
Nový
│
│
│
 
│
 
│
 
 
 
└ 
Re: Co to vůbec je "dobře implementované Unicode"?
Juraj DURECH 31. 10. 2007 16:44
Nový
│
│
│
 
│
 
└ 
Re: Co to vůbec je "dobře implementované Unicode"?
LO 29. 10. 2007 17:21
Nový
│
│
│
 
└ 
Re: Co to vůbec je "dobře implementované Unicode"?
bubak 29. 10. 2007 19:40
Nový
│
│
│
 
 
└ 
Re: Co to vůbec je "dobře implementované Unicode"?
anonymní uživatel 29. 10. 2007 20:04
Nový
│
│
├ 
Re: Co to vůbec je "dobře implementované Unicode"?
Ondrej 'SanTiago' Zajicek 29. 10. 2007 11:02
Nový
│
│
│
└ 
Re: Co to vůbec je "dobře implementované Unicode"?
Miloslav Ponkrác 29. 10. 2007 13:13
Nový
│
│
│
 
└ 
Re: Co to vůbec je "dobře implementované Unicode"?
LO 29. 10. 2007 17:24
Nový
│
│
└ 
Re: Co to vůbec je "dobře implementované Unicode"?
LO 29. 10. 2007 16:57
Nový
│
│
 
├ 
Re: Co to vůbec je "dobře implementované Unicode"?
Ondrej 'SanTiago' Zajicek 29. 10. 2007 17:50
Nový
│
│
 
│
└ 
Re: Co to vůbec je "dobře implementované Unicode"?
LO 29. 10. 2007 23:45
Nový
│
│
 
└ 
Re: Co to vůbec je "dobře implementované Unicode"?
BoneFlute 4. 1. 2008 18:55
Nový
│
│
 
 
└ 
Re: Co to vůbec je "dobře implementované Unicode"?
Lael Ophir 8. 1. 2008 13:02
Nový
│
│
 
 
 
└ 
Re: Co to vůbec je "dobře implementované Unicode"?
BoneFlute 9. 1. 2008 01:11
Nový
│
├ 
Re: Co to vůbec je "dobře implementované Unicode"?
Ondrej 'SanTiago' Zajicek 29. 10. 2007 11:15
Nový
│
│
├ 
Re: Co to vůbec je "dobře implementované Unicode"?
Miloslav Ponkrác 29. 10. 2007 12:17
Nový
│
│
└ 
Re: Co to vůbec je "dobře implementované Unicode"?
LO 29. 10. 2007 17:26
Nový
│
└ 
Re: Co to vůbec je "dobře implementované Unicode"?
Ondrej 'SanTiago' Zajicek 29. 10. 2007 11:50
Nový
│
 
├ 
Re: Co to vůbec je "dobře implementované Unicode"?
Miloslav Ponkrác 29. 10. 2007 12:20
Nový
│
 
└ 
Re: Co to vůbec je "dobře implementované Unicode"?
LO 30. 10. 2007 00:08
Nový
│
 
 
└ 
Re: Co to vůbec je "dobře implementované Unicode"?
BoneFlute 4. 1. 2008 19:47
Nový
│
 
 
 
└ 
Re: Co to vůbec je "dobře implementované Unicode"?
Lael Ophir 8. 1. 2008 13:09
Nový
│
 
 
 
 
└ 
Re: Co to vůbec je "dobře implementované Unicode"?
BoneFlute 9. 1. 2008 01:13
Nový
└ 
Re: Co to vůbec je "dobře implementované Unicode"?
sf 29. 10. 2007 08:44
Nový
 
├ 
Re: Co to vůbec je "dobře implementované Unicode"?
sf 29. 10. 2007 08:47
Nový
 
│
└ 
Re: Co to vůbec je "dobře implementované Unicode"?
anonymní uživatel 29. 10. 2007 09:35
Nový
 
└ 
Re: Co to vůbec je "dobře implementované Unicode"?
Rejpal 29. 10. 2007 10:27
Nový
 
 
├ 
Re: Co to vůbec je "dobře implementované Unicode"?
Ondrej 'SanTiago' Zajicek 29. 10. 2007 11:06
Nový
 
 
│
└ 
Re: Co to vůbec je "dobře implementované Unicode"?
anonymní uživatel 29. 10. 2007 11:35
Nový
 
 
│
 
└ 
Re: Co to vůbec je "dobře implementované Unicode"?
Ondrej 'SanTiago' Zajicek 29. 10. 2007 11:57
Nový
 
 
│
 
 
├ 
Re: Co to vůbec je "dobře implementované Unicode"?
anonymní uživatel 29. 10. 2007 12:05
Nový
 
 
│
 
 
│
└ 
Re: Co to vůbec je "dobře implementované Unicode"?
Ondrej 'SanTiago' Zajicek 29. 10. 2007 12:28
Nový
 
 
│
 
 
└ 
Re: Co to vůbec je "dobře implementované Unicode"?
Miloslav Ponkrác 29. 10. 2007 13:05
Nový
 
 
│
 
 
 
└ 
Re: Co to vůbec je "dobře implementované Unicode"?
Ondrej 'SanTiago' Zajicek 29. 10. 2007 13:36
Nový
 
 
│
 
 
 
 
├ 
Re: Co to vůbec je "dobře implementované Unicode"?
anonymní uživatel 29. 10. 2007 13:48
Nový
 
 
│
 
 
 
 
│
└ 
Re: Co to vůbec je "dobře implementované Unicode"?
Miloslav Ponkrác 29. 10. 2007 14:00
Nový
 
 
│
 
 
 
 
├ 
Re: Co to vůbec je "dobře implementované Unicode"?
Miloslav Ponkrác 29. 10. 2007 13:53
Nový
 
 
│
 
 
 
 
└ 
Re: Co to vůbec je "dobře implementované Unicode"?
Inkvizitor 29. 10. 2007 19:37
Nový
 
 
│
 
 
 
 
 
└ 
Re: Co to vůbec je "dobře implementované Unicode"?
Miloslav Ponkrác 29. 10. 2007 21:31
Nový
 
 
│
 
 
 
 
 
 
└ 
Re: Co to vůbec je "dobře implementované Unicode"?
Inkvizitor 29. 10. 2007 21:49
Nový
 
 
└ 
Re: Co to vůbec je "dobře implementované Unicode"?
repulsive 29. 10. 2007 11:12
Nový
 
 
 
└ 
Re: Co to vůbec je "dobře implementované Unicode"?
Zdenek 29. 10. 2007 12:58
Nový
 
 
 
 
└ 
Re: Co to vůbec je "dobře implementované Unicode"?
anonymní uživatel 29. 10. 2007 13:27
Nový
 
 
 
 
 
└ 
Re: Co to vůbec je "dobře implementované Unicode"?
LO 30. 10. 2007 00:16
Nový
 
 
 
 
 
 
├ 
Re: Co to vůbec je "dobře implementované Unicode"?
anonymní uživatel 30. 10. 2007 09:53
Nový
 
 
 
 
 
 
└ 
Re: Co to vůbec je "dobře implementované Unicode"?
Sten 30. 10. 2007 22:32
Nový
 
 
 
 
 
 
 
└ 
Re: Co to vůbec je "dobře implementované Unicode"?
anonymní uživatel 31. 10. 2007 01:49
Nový
       

Tento text je již více než dva měsíce starý. Chcete-li na něj reagovat v diskusi, pravděpodobně vám již nikdo neodpoví. Pro řešení aktuálních problémů doporučujeme využít naše diskusní fórum.

Zasílat nově přidané příspěvky e-mailem