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í
×
eParkomat, startup z ČR, postoupil mezi finalisty evropského akcelerátoru ChallengeUp!
Robot na pivo mu otevřel dveře k opravdovému byznysu
Internet věcí: Propojený svět? Už se to blíží...
včera 16:24 | Nová verze

Byla vydána Mageia 5.1. Jedná se o první opravné vydání verze 5, jež vyšla v červnu loňského roku (zprávička). Uživatelům verze 5 nepřináší opravné vydání nic nového, samozřejmě pokud pravidelně aktualizují. Vydání obsahuje všechny aktualizace za posledního téměř půldruhého roku. Mageia 5.1 obsahuje LibreOffice 4.4.7, Linux 4.4.32, KDE4 4.14.5 nebo GNOME 3.14.3.

Ladislav Hagara | Komentářů: 0
včera 13:42 | Pozvánky

V Praze probíhá konference Internet a Technologie 16.2, volné pokračování jarní konference sdružení CZ.NIC. Konferenci lze sledovat online na YouTube. K dispozici je také archiv předchozích konferencí.

Ladislav Hagara | Komentářů: 0
2.12. 22:44 | Komunita

Joinup informuje, že Mnichov používá open source groupware Kolab. V srpnu byl dokončen dvouletý přechod na toto řešení. V provozu je asi 60 000 poštovních schránek. Nejenom Kolabu se věnoval Georg Greve ve své přednášce Open Source: the future for the European institutions (SlideShare) na konferenci DIGITEC 2016, jež proběhla v úterý 29. listopadu v Bruselu. Videozáznam přednášek z hlavního sálu je ke zhlédnutí na Livestreamu.

Ladislav Hagara | Komentářů: 19
2.12. 15:30 | Zajímavý projekt

Společnost Jolla oznámila v příspěvku Case study: Sailfish Watch na svém blogu, že naportovala Sailfish OS na chytré hodinky. Využila a inspirovala se otevřeným operačním systémem pro chytré hodinky AsteroidOS. Použita je knihovna libhybris. Ukázka ovládání hodinek na YouTube.

Ladislav Hagara | Komentářů: 8
2.12. 14:15 | Nová verze

Byla vydána verze 7.1.0 skriptovacího jazyka PHP používaného zejména k vývoji dynamických webových stránek. Jedná se o první stabilní verzi nejnovější větvě 7.1. Přehled novinek v dokumentaci. Podrobnosti v ChangeLogu. K dispozici je také příručka pro přechod z PHP 7.0.x na PHP 7.1.x.

Ladislav Hagara | Komentářů: 2
2.12. 12:55 | Nová verze

Google Chrome 55 byl prohlášen za stabilní. Nejnovější stabilní verze 55.0.2883.75 tohoto webového prohlížeče přináší řadu oprav a vylepšení (YouTube). Opraveno bylo také 36 bezpečnostních chyb. Mariusz Mlynski si například vydělal 22 500 dolarů za 3 nahlášené chyby (Universal XSS in Blink).

Ladislav Hagara | Komentářů: 4
2.12. 11:55 | Pozvánky

Máte rádi svobodný software a hardware nebo se o nich chcete něco dozvědět? Přijďte na 135. sraz spolku OpenAlt, který se bude konat ve čtvrtek 8. prosince od 18:00 v Radegastovně Perón (Stroupežnického 20, Praha 5). Sraz bude tentokrát tématický. Bude retro! K vidění budou přístroje jako Psion 5mx nebo Palm Z22. Ze svobodného hardwaru pak Openmoko nebo čtečka WikiReader. Přijďte se i vy pochlubit svými legendami, nebo alespoň na pivo. Moderní hardware má vstup samozřejmě také povolen.

xkucf03 | Komentářů: 0
2.12. 00:10 | Nová verze

Byla vydána verze 3.2 svobodného systému pro detekci a prevenci průniků a monitorování bezpečnosti počítačových sítí Suricata. Z novinek lze zmínit například podporu protokolů DNP3 a CIP/ENIP, vylepšenou podporu TLS a samozřejmě také aktualizovanou dokumentaci.

Ladislav Hagara | Komentářů: 0
1.12. 21:00 | Nová verze

Byla vydána beta verze Linux Mintu 18.1 s kódovým jménem Serena. Na blogu Linux Mintu jsou hned dvě oznámení. První o vydání Linux Mintu s prostředím MATE a druhé o vydání Linux Mintu s prostředím Cinnamon. Stejným způsobem jsou rozděleny také poznámky k vydání (MATE, Cinnamon) a přehled novinek s náhledy (MATE, Cinnamon). Linux Mint 18.1 bude podporován až do roku 2021.

Ladislav Hagara | Komentářů: 0
1.12. 16:42 | Nová verze

Byl vydán Devuan Jessie 1.0 Beta 2. Jedná se o druhou beta verzi forku Debianu bez systemd představeného v listopadu 2014 (zprávička). První beta verze byla vydána v dubnu letošního roku (zprávička). Jedna z posledních přednášek věnovaných Devuanu proběhla v listopadu na konferenci FSCONS 2016 (YouTube, pdf).

Ladislav Hagara | Komentářů: 0
Kolik máte dat ve svém domovském adresáři na svém primárním osobním počítači?
 (32%)
 (24%)
 (29%)
 (7%)
 (5%)
 (3%)
Celkem 767 hlasů
 Komentářů: 50, poslední 29.11. 15:50
Rozcestník
Reklama

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

otula avatar 1.8.2009 16:09 otula | skóre: 44 | blog: otakar | Adamov
PHP xml parser a problém s českými znaky
Přečteno: 1455×
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: 44 | 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: 44 | 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: 44 | 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: 44 | 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: 44 | 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: 44 | 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: 44 | 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.