Hlavní navigace

Ruby a unicode: co přinese chystané Ruby 1.9?

19. 11. 2007
Doba čtení: 3 minuty

Sdílet

V posledním díle miniseriálku o unicode v Ruby vezmeme do rukou křišťálovou kouli a nahlédneme do budoucnosti jazyka – podíváme se na podporu unicode v chystaném Ruby 1.9 a pro zajímavost si také řekneme pár slov o podpoře unicode v alternativních implementacích Ruby.

Unicode teprve teď?!

Podpora unicode je slibována do příští stabilní major verze, která bude díky změně číslování označována jako Ruby 1.9. Věřím, že mnozí z vás si pokládají otázku, proč trvalo tak dlouho rozhoupat se k dodání tak důležité technologie do jazyka. Odpověď je prostá – Matz, otec Ruby, stejně jako velká řada dalších programátorů ovlivňující budoucnost Ruby, nejsou nakloněni konverzi různých druhů kódování do unicode, zejména mělo-li by se potom zase konvertovat zpět do výchozího kódování. Hledala se šetrnější alternativa a nakonec bylo rozhodnuto, že řetězec ponese automaticky údaj o svém kódování a žádné konvertování z a do unicode se konat nebude. Defaultní kódování bude zřejmě UTF-8, samozřejmě nebude žádný problém jej změnit například na kódování CP-1250 nebo ISO-8859–2, Ruby si s tím už poradí. Řetězec bude sledem znaků, ať použijete jakékoliv kódování.

"hola hej"[0]
=> h # místo 104

Tato změna se logicky dotkne metod zpracovávajících vstup, takže napříkad při otevírání souboru půjde určit, v jakém kódování očekáváme jeho obsah. Změny lze očekávat také v některých metodách řetězce, jako například v metodě [], která bude logicky vracet znak místo ASCII hodnoty znaku.

Určení kódování

Aby bylo jasné, v jakém kódování skript je, bude nově třeba přidat do skriptu komentář nesoucí informaci o jeho kódování:

#!/usr/bin/env ruby
# coding=utf-8

Je důležité, aby byl tento komentář na prvním nebo druhém řádku skriptu, jinak nebude fungovat. V unixových systémech je logické jeho umístění hned za informaci o použitém interpretu, kterou systém očekává na prvním řádku

A jak to vypadá v praxi?

Zkoušel jsem zkompilovat snapshot vývojové verze Ruby, výsledky jsou poměrně pozitivní:

#!/usr/bin/env ruby
# coding=utf-8

puts("čeština".length)
puts("čeština".reverse)
"čeština".each_char { |char| print("#{char} ") }

=> 7
=> anitšeč
=> č e š t i n a

Jak je vidno z ukázky, již skutečně platí, že řetězec je sousledností znaků, takže spoustu dříve nefunkčních metod třídy String již funguje bez potíží. Do Ruby byla též vrácena metoda each_char, kterou lze používat k procházení jednotlivých znaků řetězce. Bohužel, metody upcase, downcase, capitalize a swapcase mi v době psaní článku stále nefungovaly, snad se dočkáme později.

JRuby

MRI není jediná implementace Ruby. Nejpokročilejší z alternativních implementací Ruby je dozajista JRuby, implementace Ruby v Javě, nad níž drží ochrannou ruku i velký Sun. Ta od verze 1.0 unicode podporuje. Protože JRuby běží pod JVM, je logické, že implementace unicode je dělána pomocí javovských řetězců kódovaných do UTF-16. JRuby umožňuje jak použití řetězců reprezentovaných jako sekvence bytů, stejně jako je tomu v současné implementaci Ruby, tak právě použití javovských unicode řetězců.

root_podpora

IronRuby

IronRuby je jedna ze dvou implementací Ruby pro platformu .NET. Je ve fázi intenzivního vývoje, unicode v něm každopádně podporováno bude – pomocí CLR stringů, které jsou unicodové. Jak bude řešena kompatibilita s chystaným Ruby 1.9.1, je zatím otázka.

Závěr, aneb co z toho a kdy to přijde?

Zdá se, že ohledně unicode se konečně začíná blýskat na lepší časy. Řešení, které je ohleduplné k těm, kteří nepoužívají UTF-8, mi připadá jako rozumná volba a v japonském prostředí, kde penetrace UTF-8 je stále poněkud problematická, se jeví logicky. Co se týče termínů vydání nového Ruby 1.9.1, Matz prohlašuje, že se můžeme těšit na letošní Vánoce. Sláva!

Odkazy

Byl pro vás článek přínosný?

Autor článku

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.