abclinuxu.cz AbcLinuxu.cz itbiz.cz ITBiz.cz HDmag.cz HDmag.cz abcprace.cz AbcPráce.cz
Inzerujte na AbcPráce.cz od 950 Kč
Rozšířené hledání
×
    dnes 02:44 | Nová verze

    Emulátory Box86 a Box64 umožňující spouštět linuxové aplikace pro x86 a x86_64 na jiných než x86 a x86_64 architekturách, například ARM a ARM64, byly vydány v nových verzích: Box86 0.3.8 a Box64 0.3.2. Ukázka možností na YouTube.

    Ladislav Hagara | Komentářů: 0
    včera 20:55 | Nová verze

    Byla vydána nová verze 6.1 neměnné (immutable) distribuce openSUSE Leap Micro určené pro běh kontejneru a virtuálních strojů. S vydáním verze 6.1 byla ukončena podpora verze 5.5.

    Ladislav Hagara | Komentářů: 0
    včera 19:55 | IT novinky

    Poslanci dnes ve třetím čtení schválili návrh zákona o digitálních financích. Cílem zákona je implementace předpisů Evropské unie v oblasti digitálních financí, konkrétně nařízení DORA (Digital Operational Resilience Act) o digitální provozní odolnosti finančního sektoru a nařízení MiCA (Markets in Crypto Assets) o trzích kryptoaktiv. Zákon nyní míří k projednání do Senátu ČR. U kryptoměn bude příjem do 100 tisíc Kč za zdaňovací období osvobozen od daně, podobně jako u cenných papírů, a to za podmínky jejich držení po dobu alespoň 3 let.

    Ladislav Hagara | Komentářů: 0
    včera 19:11 | Komunita

    O víkendu (15:00 až 23:00) proběhne EmacsConf 2024, tj. online konference vývojářů a uživatelů editoru GNU Emacs. Sledovat ji bude možné na stránkách konference. Záznamy budou k dispozici přímo z programu.

    Ladislav Hagara | Komentářů: 0
    včera 10:22 | Nová verze

    Mozilla má nové logo a vizuální identitu. Profesionální. Vytvořeno u Jones Knowles Ritchie (JKR). Na dalších 25 let.

    Ladislav Hagara | Komentářů: 20
    5.12. 23:33 | Komunita

    Bylo rozhodnuto, že nejnovější Linux 6.12 je jádrem s prodlouženou upstream podporou (LTS). Ta je aktuálně plánována do prosince 2026. LTS jader je aktuálně šest: 5.4, 5.10, 5.15, 6.1, 6.6 a 6.12.

    Ladislav Hagara | Komentářů: 0
    5.12. 15:11 | Nová verze

    Byla vydána nová stabilní verze 3.21.0, tj. první z nové řady 3.21, minimalistické linuxové distribuce zaměřené na bezpečnost Alpine Linux (Wikipedie) postavené na standardní knihovně jazyka C musl libc a BusyBoxu. Z novinek lze vypíchnou počáteční podporu architektury Loongson LoongArch64.

    Ladislav Hagara | Komentářů: 0
    5.12. 11:33 | IT novinky

    Mapy.cz Premium stojí 249 korun ročně. Premium verze je zaváděna postupně.

    Ladislav Hagara | Komentářů: 29
    5.12. 11:00 | IT novinky

    Hodnota Bitcoinu, decentralizované kryptoměny překonala 100 000 dolarů (2 390 000 korun).

    JZD | Komentářů: 16
    5.12. 05:11 | Zajímavý software

    Hurl byl vydán ve verzi 6.0.0. Hurl je nástroj běžící v příkazovém řádku, který spouští HTTP požadavky definované v textovém souboru.

    Ladislav Hagara | Komentářů: 0
    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: 1502×
    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áknoNahoru

    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.