Unicode

Asi každý sa už stretol s textom, v ktorom boli „pokazené“ slovenské znaky s diakritikou. Napríklad namiesto niektorých znakov boli štvorčeky alebo bodky (časté je nahradenie písmena „ľ“ znakom „3/4“. Ľahko si možno predstaviť, aké problémy majú asi Číňania alebo Japonci... Unicode by malo práve tieto problémy vyriešiť.

Tak ako všetky ostatné dáta aj text je v počítači reprezentovaný ako čísla. Základná pamäťová jednotka - bajt - umožňuje uložiť čísla od 0 do 255. Aké písmeno je reprezentované príslušným číslom určuje takzvané kódovanie znakov (character encoding). Pri prvých 128 (0-127) sa väčšina systémov zhodla na kódovaní ASCII, ktoré však obsahuje iba znaky pre angličtinu. Zvyšných 128 sa v rôznych kódovaniach líši. Pre slovenčinu sa na väčšine systémov sa používa ISO-8859-2, ktoré je aj slovenským štandardom. Ako to už ale býva, vlastné kódovanie používa Microsoft (CP1250), v DOSe bolo najčastejšie kódovanie Kamenických a existuje ešte aj zopár ďalších. Pri kódovaní iných jazykov so špeciálnymi znakmi, najmä exotických (čínskych, japonských, kórejských, ...), je situácia podobná. Ak program nepodporuje kódovanie, v ktorom je načítavaný text, zobrazí niektoré (občas aj všetky) znaky nesprávne alebo vôbec.

Unicode vzniklo ako štandard, ktorý má priradiť číslo ku všetkým existujúcim znakom všetkých jazykov. Samozrejme, jeden bajt by nestačil na všetky znaky, dokonca ani dva. Unicode preto používa na niektoré znaky až štyri bajty.

Používať v každom texte priamo štyri bajty pre každý znak by dĺžku väčšiny textov automaticky zoštvornásobilo. Preto sa používa niekoľko spôsobov zápisu, z ktorých najčastejšie sú UTF8 a UCS-2.

UTF8 používa pre všetky znaky iba potrebný počet znakov, klasické ASCII znaky preto zaberajú iba jeden bajt, všetky ostatné viac bajtov (napríklad všetky slovenské znaky zaberajú dva bajty). Vďaka tomu sa dĺžka textov väčšinou zvýši iba minimálne. Nerovnaká dĺžka znakov prináša problémy len programátorom. UTF8 je odporúčané ako najlepšie kódovanie aj samotným autorom štandardu Unicode.

UCS-2 používa pre každý znak dva bajty. Kvôli tomu síce nemôže obsahovať všetky znaky Unicode, z programátorského hľadiska je ale fixná dĺžka znakov výhodou. Tento spôsob používa hlavne Microsoft a aj to je jedným z dôvodov, prečo sú súbory Wordu 97 a novších dva krát také veľké ako vo verzii 95 - všetky znaky sa totiž ukladajú namiesto jedného do dvoch bajtov.

Výhody používania Unicode sú jasné: jeho použitím odpadnú všetky problémy s rôznym kódovaním znakov a umožní bezproblémové písanie viacjazyčných textov (problémom nie je ani citácia v japončine alebo čínštine).

Podpora Unicode sa objavuje v stále väčšom počte programov a časom sa hádam dočkáme aj zjednotenia zápisu. Keďže sa jedná viac-menej o technický problém, o ktorom používateľ ani nemusí nič vedieť, z jeho pohľadu sa nič nezmení.

Základnou nevýhodou Unicode je, že pre väčšinu znakov vyžaduje dva alebo viac bajtov, čo znamená predĺženie textov. V dnešnej dobe neustáleho zväčšovania kapacity dátových médií to už nehrá až takú rolu, navyše toto zväčšenie je pri použití kódovania UTF-8 v praxi minimálne.

Samotné priradenie znakov má ešte stále nejaké problémy, týkajú sa len exotických jazykov; pre všetky európske jazyky už pracuje bez problémov.

Asi najväčšou nevýhodou Unicode je komplikované overovanie správnosti; chyby v tejto oblasti môžu spôsobiť bezpečnostné diery v programoch. Toto je však starosť programátorov, ktorí sa s ňou dúfajme čoskoro úspešne vysporiadajú.

Pbatenghyngvbaf Lbh ner n bofreinag jro unpxre Vs Lbh jnag n wbo va bhe pbzcnal cyrnfr znvy gb gbhtuthl ng ci2p qbg fx Unir n avpr qnl
V období nedostatku zboží je umístění obchodu poměrně méně důležité.
		-- Walker
    function perr($msg, $level)
    {
        echo $msg;
    }

    function readcsv_get_entity($fh, $sep = ';')
    {
        $entity = array();
        $attr = '';
        $eoe = false;

        while((! feof($fh)) && (! $eoe))
        {
            $ch = fgetc($fh);
            switch($ch)
            {
                case "\r":
                    break;
                case "\n":
                    $eoe = true;
                case $sep:
                    array_push($entity, $attr);
                    $attr = '';
                    break;
                case '"':
                    $ch = '';
                    while((! feof($fh)) && $ch != '"')
                    {
                        $ch = fgetc($fh);
                        $attr .= $ch;
                    }
                    $attr = rtrim($attr, '"');
                    break;
                default:
                    $attr .= $ch;
            }
        }

        if(feof($fh) && ($entity || $attr))
        {
            array_push($entity, $attr);
        }
        elseif(feof($fh))
        {
            $entity = false;
        }

        return $entity;
    }

    function readcsv_parsecsv($filename)
    {
        $ret = false;
        $sep = ';';
        $line = '';
        $line_num = 0;
        $cells = array();
        $names = array();

        $fh = fopen($filename, 'r');
        if(! $fh)
        {
            perr('Failed to open file \''
                . $file . "'\n", 8);
        }
        else
        {
        $line = '';
        while(! feof($fh))
        {
        $entity = readcsv_get_entity($fh, $sep);

        if($entity)
        {
        if($line_num == 0)
        {
        foreach($entity as $name)
        {
            array_push($names, trim($name, '"'));
        }
        }
        else
        {
        foreach($entity as $index => $val)
        {
        if(isset($names[$index]))
        {
            $cells[$line_num][$names[$index]]
                = trim($val, '"');
        }
        else
        {
            array_push($cells[$line_num],
                trim($val, '"'));
        }                            
        }
        }
        $line_num ++;
        }
        }
        fclose($fh);
        }

        return $ret;
    }
        
    function perr($msg, $level)
    {
        echo $msg;
    }

    function readcsv_get_entity($fh, $sep = ';')
    {
        $entity = array();
        $attr = '';
        $eoe = false;

        while((! feof($fh)) && (! $eoe))
        {
            $ch = fgetc($fh);
            switch($ch)
            {
                case "\r":
                    break;
                case "\n":
                    $eoe = true;
                case $sep:
                    array_push($entity, $attr);
                    $attr = '';
                    break;
                case '"':
                    $ch = '';
                    while((! feof($fh)) && $ch != '"')
                    {
                        $ch = fgetc($fh);
                        $attr .= $ch;
                    }
                    $attr = rtrim($attr, '"');
                    break;
                default:
                    $attr .= $ch;
            }
        }

        if(feof($fh) && ($entity || $attr))
        {
            array_push($entity, $attr);
        }
        elseif(feof($fh))
        {
            $entity = false;
        }

        return $entity;
    }

    function readcsv_parsecsv($filename)
    {
        $ret = false;
        $sep = ';';
        $line = '';
        $line_num = 0;
        $cells = array();
        $names = array();

        $fh = fopen($filename, 'r');
        if(! $fh)
        {
            perr('Failed to open file \''
                . $file . "'\n", 8);
        }
        else
        {
        $line = '';
        while(! feof($fh))
        {
        $entity = readcsv_get_entity($fh, $sep);

        if($entity)
        {
        if($line_num == 0)
        {
        foreach($entity as $name)
        {
            array_push($names, trim($name, '"'));
        }
        }
        else
        {
        foreach($entity as $index => $val)
        {
        if(isset($names[$index]))
        {
            $cells[$line_num][$names[$index]]
                = trim($val, '"');
        }
        else
        {
            array_push($cells[$line_num],
                trim($val, '"'));
        }                            
        }
        }
        $line_num ++;
        }
        }
        fclose($fh);
        }

        return $ret;
    }