abclinuxu.cz AbcLinuxu.cz itbiz.cz ITBiz.cz HDmag.cz HDmag.cz abcprace.cz AbcPráce.cz
AbcLinuxu hledá autory!
Inzerujte na AbcPráce.cz od 950 Kč
Rozšířené hledání
×

    dnes 00:33 | Nová verze

    Byla vydána OpenIndiana 2026.10. Unixový operační systém OpenIndiana (Wikipedie) vychází z OpenSolarisu (Wikipedie).

    Ladislav Hagara | Komentářů: 1
    dnes 00:22 | IT novinky

    Americký výrobce polovodičů onsemi (ON Semiconductor) zrušil plány na rozšíření výroby v rožnovském závodě v Česku za dvě miliardy dolarů (podle aktuálního kurzu zhruba 43,5 mld. Kč). Důvodem je vývoj na trhu.

    Ladislav Hagara | Komentářů: 1
    včera 13:00 | Bezpečnostní upozornění
    Nové vydání zlib opravuje několik problémů při kompresi a dekompresi dat, přetečení bufferů, čtení mimo vyhrazenou paměť, únik neinicializovaných dat. Zvlášť významné jsou chyby v inflateGetDictionary(), inflateSync() a gzwrite(), které mohou způsobit poškození paměti. Vysoká relevance - zlib používá řada systémových i aplikačních komponent.
    vencour | Komentářů: 1
    včera 12:25 | Bezpečnostní upozornění
    Digicert hlásí neoprávněné čtení archivních zákaznických údajů. Došlo k němu po migraci z února 2025, po níž se interní systém, dříve dostupný jen přes VPN, stal přístupným z internetu. Chyba v oprávněních umožnila nově vytvořeným účtům číst archivní záznamy. K přístupu k datům mělo dojít mezi 27. červnem a 2. červencem 2026. DigiCert neoprávněné čtení potvrdil až 19. října 2026. Problém zpočátku vyhodnotil jako tvorbu účtů, ne jako … více »
    vencour | Komentářů: 1
    včera 04:44 | Pozvánky

    O víkendu probíhá na FIT VUT v Brně konference OpenAlt 2026 o otevřeném softwaru a datech, IT bezpečnosti, DIY a IoT. Na programu je spousta zajímavých přednášek. Pokud jste v Brně, stavte se. Vstup zdarma. Přednášky lze sledovat i online na VHSky a YouTube.

    Ladislav Hagara | Komentářů: 1
    včera 02:11 | IT novinky

    Qualcomm uzavřel víceletou dohodu se SpaceX. Bude dodávat rádiové technologie, baseband jednotky a software pro plánovanou pozemní 5G síť Starlink Mobile. Výstavba má zahrnovat desítky tisíc základnových stanic v USA. Zahájení nasazování se očekává v roce 2027. Qualcomm dohodu označuje za svůj dosud největší 5G kontrakt.

    vencour | Komentářů: 0
    včera 02:00 | IT novinky

    Google rozšířil Cloud Vulnerability Reward Program. Nově nabízí odměnu až 250 tisíc dolarů za vysoce závažné architektonické bezpečnostní chyby označované jako Root-in-Cloud.

    vencour | Komentářů: 0
    6.11. 12:22 | IT novinky

    V březnu byla oznámena spolupráce GrapheneOS s Motorolou. Nejnovější vlajka Motorola Signature 27 je první Motorola s oficiální podporou GrapheneOS. GrapheneOS (Wikpedie) je varianta Androidu zaměřující se na bezpečnost a soukromí.

    Ladislav Hagara | Komentářů: 0
    6.11. 04:55 | Nová verze

    Omarchy (Wikipedie) je linuxová distribuce s dlaždicovým správcem oken Hyprland. Založena je na Arch Linuxu. Vydána byla v nové verzi 4.5.0. Nově také pro Apple Silicon, konkrétně pro M1/M2/M3/Neo MacBooky.

    Ladislav Hagara | Komentářů: 3
    6.11. 03:22 | Nová verze

    Byla vydána nová stabilní verze 8.3 webového prohlížeče Vivaldi (Wikipedie). Postavena je na Chromiu 156 s bezpečnostními opravami z Chromia 157. Přehled novinek i s náhledy v příspěvku na blogu.

    Ladislav Hagara | Komentářů: 0
    Které desktopové prostředí na Linuxu používáte?
     (9%)
     (7%)
     (4%)
     (21%)
     (30%)
     (9%)
     (5%)
     (2%)
     (14%)
     (20%)
    Celkem 3002 hlasů
     Komentářů: 35, poslední 6.11. 23:27
    Rozcestník

    Dotaz: PHP xml parser a problém s českými znaky

    otula avatar 1.8.2009 16:09 otula | skóre: 45 | blog: otakar | Adamov
    PHP xml parser a problém s českými znaky
    Přečteno: 1811×
    Potřeboval jsem na jedny skromnější stránky udělat jednoduchou fotogalerii. Programovat v PHP moc neumím, zvládám nějaké základy, s nimiž si obvykle tak nějak vystačím. A pro účel té fotogalerie jsem si upravil fotogalerii od Tomáše Párala. Vše funguje dobře až na problém, který je už v původním kódu. Pro popisky fotek se používá soubor popisky.txt - tam je vše v pořádku, ovšem název a popis galerie, autor a pár dalších informací se bere ze souboru config.xml, a tam nastává problém. Pokud je v některém popisu znak s diakritikou, parser před ním zastaví a tento ani další znaky již nezpracuje. A skočí na další položku. Psal jsem Tomášovi, ale odepsal mi, že se již dlouho PHP nevěnuje, ale že by ten problém měl být někde v parseru.

    config.xml vypadá takto:
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE conf SYSTEM "../config.dtd">
    <conf>
    	<const name="ROW_THUMB_NUM" desc="pocet nahledu na radce">3</const>
    	<const name="PREFIX" desc="prefix souboru s nahledem">tn_</const>
    	<const name="DESC_FILE" desc="nazev souboru s popiskami">popisky.txt</const>
    	<const name="SHOW_DESC" desc="zobrazovat popisky u fotek [0|1]">1</const>
    	<const name="SHOW_THUMB_DESC" desc="zobrazovat popisky i u nahledu [0|1]">1</const>
    	<const name="IMPLICIT_DESC" desc="implicitni title a alt, tak kde neni popisek">obrázek</const>
    	<const name="GALLERY_NAME" desc="popis galerie">Jarní květinky</const>
    	<const name="DATE" desc="datum vytvoreni fotek"></const>
    	<const name="AUTHOR" desc="autor fotografii">Oťula</const>
    	<const name="NOTE" desc="poznamka k fotogalerii">Jsou opravdu překrásné</const>
    </conf>
    
    A parser vypadá takto (je v něm už doplněno i vše možné, co jsem poznacházel po webu ohledně UTF-8, že by mělo pomoci, ale nepomohlo):
    function start_element($parser,$tag,$attr)
    {
      global $at, $desc, $current;
    
      $current=$tag;
      if (strcmp($tag,"const")==0)
      {
        $at=$attr["name"];
      }
    }
    
    function end_element($parser,$tag)
    {
      global $current;
    
      $current="";
    }
    
    function element_data($parser,$data)
    {
      global $at,$current;
    
      if (strcmp($current,"const")==0)
      {
        define($at,$data);
      }
    } 
    
    function config($loc)
    {
      if (!file_exists($loc))
      {
        return 0;
      }
      else
      {
        if(!($f=fopen($loc,"r")))
        {
          return 0;
        }
        else
        {
          $at="";
          $current="";
          $parser=xml_parser_create("UTF-8");
          xml_parser_set_option($parser, XML_OPTION_TARGET_ENCODING,"UTF-8");
          xml_parser_set_option($parser,XML_OPTION_SKIP_WHITE,1);
          xml_parser_set_option($parser,XML_OPTION_CASE_FOLDING,0);
          xml_set_element_handler($parser,"start_element","end_element");
          xml_set_character_data_handler($parser,"element_data");
    
          if(!xml_parse($parser,fread($f,filesize($loc))))
          {
            xml_parser_free($parser);
            return 0;
          }
        }
      xml_parser_free($parser);
      return 1;
      }
    }
    
    Při uvedených příkladech to tedy vypadá tak, že se název galerie zobrazí "Jarn", autor "O", implicitní title a alt "obr", a poznámka "Jsou opravdu p".

    Byl bych vděčný za radu, jak to dát dohromady.
    Kdo vám tvrdí, že jste paranoidní, ten v tom spiknutí s největší pravděpodobností jede taky.

    Řešení dotazu:


    Odpovědi

    1.8.2009 16:33 Andrej Herceg | skóre: 43
    Rozbalit Rozbalit vše Re: PHP xml parser a problém s českými znaky
    Keď to dám do php súboru, pridám k tomu správnu html hlavičku (kvôli kódovaniu) a takéto funkcie:
    config("config.xml");
    $dc = get_defined_constants(true);
    echo "<pre>", print_r($dc["user"], true), "</pre>";
    tak sa mi zobrazí niečo takéto:
    Array
    (
        [ROW_THUMB_NUM] => 3
        [PREFIX] => tn_
        [DESC_FILE] => popisky.txt
        [SHOW_DESC] => 1
        [SHOW_THUMB_DESC] => 1
        [IMPLICIT_DESC] => obrázek
        [GALLERY_NAME] => Jarní květinky
        [AUTHOR] => Oťula
        [NOTE] => Jsou opravdu překrásné
    )
    (a teda, mne to funguje normálne)
    otula avatar 1.8.2009 16:44 otula | skóre: 45 | blog: otakar | Adamov
    Rozbalit Rozbalit vše Re: PHP xml parser a problém s českými znaky
    Tak to jsem z toho jelen. No v souboru, který zobrazuje výsledek, je něco takového:
    ...
    
      //nacteni konstant z xml souboru
      include("./xml.php"); //nacteni xml parseru
      @$chyba = config($folder.$setting); //pokud nebyl config.xml nalezen, tak nastav hodnoty explicitne
        
      //implicitni nastaveni promenych z config.xml
      (!defined("THUMB_NUM"))?define("THUMB_NUM","15"):""; //9 nahledu na stranku
      (!defined("ROW_THUMB_NUM"))?define("ROW_THUMB_NUM","3"):""; // 3 nahledy na radku
      (!defined("PREFIX"))?define("PREFIX","tn_"):""; //prefix souboru s nahledy
      (!defined("DESC_FILE"))?define("DESC_FILE","popisky.txt"):""; //nazev souboru s popiskami
      (!defined("SHOW_DESC"))?define("SHOW_DESC","1"):""; // zobrazovat popisky u fotek
      (!defined("SHOW_THUMB_DESC"))?define("SHOW_THUMB_DESC","1"):""; // zobrazovat popisky u nahledu
      (!defined("IMPLICIT_DESC"))?define("IMPLICIT_DESC","obrázek"):""; // implicitni popiska 
      (!defined("GALERY_NAME"))?define("GALLERY_NAME",""):""; // nazev galerie
      (!defined("DATE"))?define("DATE",""):""; // datum vytvoreni fotek
      (!defined("AUTHOR"))?define("AUTHOR",""):""; // autor fotek
      (!defined("NOTE"))?define("NOTE",""):""; //poznamka k fotogalerii
    
    ...
    ...
    ...
    ...
    
    //vypis nadpisu, autora a data porizeni fotek
      echo "<div id=\"hlavicka\">\n";
        echo (GALLERY_NAME != "" && defined("GALLERY_NAME"))?"<h2>".GALLERY_NAME."</h2>\n":"\n";
        echo (NOTE != "" && defined("NOTE"))?"<p>".NOTE."</p>\n":"\n";
        echo (AUTHOR != "" && defined("AUTHOR"))?"<p><strong>Autor: </strong>".AUTHOR."</p>\n":"\n";
        echo (DATE != "" && defined("DATE"))?"<p><strong>Datum: </strong>".DATE."</p>\n":"\n";
      echo "</div>\n"; 
    
    ...
    ...
    ...
    
    a je to načítáno do souboru s takovouto hlavičkou:
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" >
    <head>
    	<meta http-equiv="content-type" content="text/html; charset=utf-8" />
    ...
    
    
    Kdo vám tvrdí, že jste paranoidní, ten v tom spiknutí s největší pravděpodobností jede taky.
    1.8.2009 16:47 Andrej Herceg | skóre: 43
    Rozbalit Rozbalit vše Re: PHP xml parser a problém s českými znaky
    Určite je aj ten config.xml v kódovaní utf-8?
    otula avatar 1.8.2009 16:53 otula | skóre: 45 | blog: otakar | Adamov
    Rozbalit Rozbalit vše Re: PHP xml parser a problém s českými znaky
    Ano, určitě je. A zkoušel jsem ho schválně uložit i v kódování jiném, a to potom nenačetlo vůbec nic.
    Kdo vám tvrdí, že jste paranoidní, ten v tom spiknutí s největší pravděpodobností jede taky.
    1.8.2009 17:19 Andrej Herceg | skóre: 43
    Rozbalit Rozbalit vše Re: PHP xml parser a problém s českými znaky
    Funguje takéto niečo ?:
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
    <html>
    <head>
    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
    </head>
    <body>
    <?php
    include("./xml.php");
    @$chyba = config("config.xml");
    $dc = get_defined_constants(true);
    echo "<pre>", print_r($dc["user"], true), "</pre>";
    ?>
    </body>
    </html>
    otula avatar 1.8.2009 17:29 otula | skóre: 45 | blog: otakar | Adamov
    Rozbalit Rozbalit vše Re: PHP xml parser a problém s českými znaky
    Tohle se chová úplně stejně špatně - a už jsem napsal níže - zjistil jsem, že se problém projevuje pouze s PHP 5. Napadá tě, co by tam mělo být jinak kvůli pětkové verzi?
    Kdo vám tvrdí, že jste paranoidní, ten v tom spiknutí s největší pravděpodobností jede taky.
    otula avatar 1.8.2009 16:57 otula | skóre: 45 | blog: otakar | Adamov
    Rozbalit Rozbalit vše Re: PHP xml parser a problém s českými znaky
    Možná by bylo ještě dobré říct, že pokud například to slůvko "obrázek" smažu v config.xml a ponechám ho v tom souboru, odkud se načte, pokud v config.xml nic není, tak je to v pořádku.
    Kdo vám tvrdí, že jste paranoidní, ten v tom spiknutí s největší pravděpodobností jede taky.
    otula avatar 1.8.2009 17:25 otula | skóre: 45 | blog: otakar | Adamov
    Rozbalit Rozbalit vše Re: PHP xml parser a problém s českými znaky
    Andreji, přišel jsem asi na to, proč to tobě funguje, a mně ne. Zkusil jsem to nahrát ještě na jiný server, kde je starší PHP (verze 4.4) - tam to jede v pohodě. Nefunguje mi to na serverech s PHP 5.

    Snad by to mohlo pomoct k nalezení řešení.
    Kdo vám tvrdí, že jste paranoidní, ten v tom spiknutí s největší pravděpodobností jede taky.
    1.8.2009 17:56 Andrej Herceg | skóre: 43
    Rozbalit Rozbalit vše Re: PHP xml parser a problém s českými znaky
    Skús mierne upraviť xml.php, tak, aby vypisoval, čo sa práve spracováva a budeš vidieť, v čom je problém. Môžeš vyskúšať niečo takéto (a ten skript, čo som posielal vyššie, aby sa ten xml súbor načítal):
    <?php
    function start_element($parser,$tag,$attr)
    {
      global $at, $desc, $current;
    echo "start_element: (", $tag, ", ", print_r($attr, true), ")<br>";
      $current=$tag;
      if (strcmp($tag,"const")==0)
      {
        $at=$attr["name"];
      }
    }
    
    function end_element($parser,$tag)
    {
      global $current;
    echo "end_element: (", $tag, ")<br>";
      $current="";
    }
    
    function element_data($parser,$data)
    {
      global $at,$current;
    echo "element_data: (", $data, ")<br>";
      if (strcmp($current,"const")==0)
      {
        define($at,$data);
      }
    }
    
    function config($loc)
    {
      if (!file_exists($loc))
      {
        return 0;
      }
      else
      {
        if(!($f=fopen($loc,"r")))
        {
          return 0;
        }
        else
        {
          $at="";
          $current="";
          $parser=xml_parser_create("UTF-8");
          xml_parser_set_option($parser, XML_OPTION_TARGET_ENCODING,"UTF-8");
          xml_parser_set_option($parser,XML_OPTION_SKIP_WHITE,1);
          xml_parser_set_option($parser,XML_OPTION_CASE_FOLDING,0);
          xml_set_element_handler($parser,"start_element","end_element");
          xml_set_character_data_handler($parser,"element_data");
    
          if(!xml_parse($parser,fread($f,filesize($loc))))
          {
            xml_parser_free($parser);
            return 0;
          }
        }
      xml_parser_free($parser);
      return 1;
      }
    }
    ?>
    Zo zobrazovaných informácií je jasné, že sa bude musieť presunúť definovanie tej konštanty až do funkcie end_element (a v element_data sa bude ten text spájať).
    otula avatar 1.8.2009 19:18 otula | skóre: 45 | blog: otakar | Adamov
    Rozbalit Rozbalit vše Re: PHP xml parser a problém s českými znaky
    Díky. Výstup tohoto opravdu už něco vypovídá:
    start_element: (const, Array ( [name] => GALLERY_NAME [desc] => nazev akce, odkud fotky pochazi ) )
    element_data: (Jarn)
    element_data: (í květinky)
    end_element: (const)
    element_data: ( )
    start_element: (const, Array ( [name] => DATE [desc] => datum vytvoreni fotek ) )
    end_element: (const)
    element_data: ( )
    start_element: (const, Array ( [name] => AUTHOR [desc] => autor fotografii ) )
    element_data: (O)
    element_data: (ťula)
    end_element: (const)
    element_data: ( )
    start_element: (const, Array ( [name] => NOTE [desc] => poznamka k fotogalerii ) )
    element_data: (Jsou opravdu p)
    element_data: (řekrásné)
    end_element: (const)
    element_data: ( )
    end_element: (conf)
    
    Kdo vám tvrdí, že jste paranoidní, ten v tom spiknutí s největší pravděpodobností jede taky.
    Řešení 2× (otula (tazatel), David Opletal)
    1.8.2009 18:06 Andrej Herceg | skóre: 43
    Rozbalit Rozbalit vše Re: PHP xml parser a problém s českými znaky
    Môžeš vyskúšať zmeniť xml.php na niečo takéto:
    <?php
    function start_element($parser,$tag,$attr)
    {
      global $at, $element_data, $desc, $current;
      
      $current=$tag;
      if (strcmp($tag,"const")==0)
      {
        $at=$attr["name"];
        $element_data = "";
      }
    }
    
    function end_element($parser,$tag)
    {
      global $at,$element_data,$current;
    
      if (strcmp($current,"const")==0)
      {
        define($at,$element_data);
      }
      $current="";
    }
    
    function element_data($parser,$data)
    {
      global $at,$element_data,$current;
    
      if (strcmp($current,"const")==0)
      {
        $element_data .= $data;
      }
    }
    
    function config($loc)
    {
      if (!file_exists($loc))
      {
        return 0;
      }
      else
      {
        if(!($f=fopen($loc,"r")))
        {
          return 0;
        }
        else
        {
          $at="";
          $current="";
          $parser=xml_parser_create("UTF-8");
          xml_parser_set_option($parser, XML_OPTION_TARGET_ENCODING,"UTF-8");
          xml_parser_set_option($parser,XML_OPTION_SKIP_WHITE,1);
          xml_parser_set_option($parser,XML_OPTION_CASE_FOLDING,0);
          xml_set_element_handler($parser,"start_element","end_element");
          xml_set_character_data_handler($parser,"element_data");
    
          if(!xml_parse($parser,fread($f,filesize($loc))))
          {
            xml_parser_free($parser);
            return 0;
          }
        }
      xml_parser_free($parser);
      return 1;
      }
    }
    ?>
    otula avatar 1.8.2009 19:21 otula | skóre: 45 | blog: otakar | Adamov
    Rozbalit Rozbalit vše Re: PHP xml parser a problém s českými znaky
    SUPER! Tohle funguje!

    Andreji, jsi zlato! Kdybys byl holka, poslal bych ti pusu :-) Až budeš v Brně, máš u mne panáka :-)
    Kdo vám tvrdí, že jste paranoidní, ten v tom spiknutí s největší pravděpodobností jede taky.

    Založit nové vlákno • Nahoru

    Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

    ISSN 1214-1267   www.czech-server.cz
    © 1999-2015 Nitemedia s. r. o. Všechna práva vyhrazena.