Hlavní navigace

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

Jakub Šťastný

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ů.

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

Našli jste v článku chybu?