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ů.
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
- Ruby 2: 2 důvody pro Ruby
- Alternativní implementace Ruby
- Paving the Road to JRuby 1.0: Unicode
- Debata o unicode v JRuby v mailing listu
- Unicode Support in JRuby
- InfoQ: State of Unicode and Ruby Compatibility for JRuby 1.0
- Paving the Road to JRuby 1.0: Unicode
- Unicode in Ruby, Unicode in JRuby?
- davidflanagan.com: August 2007 Archives