Oznámení
Chyba v kódování headingModule->title
před 11 lety

- TFSi
 - Člen | 23
 
Zdravím, používám Texy2 beta revizi 212.
Celý web mám v ISO 8859–2 a z příkladů jsem si do webu přidal
cachování obsahu (s tím, že ho ještě časem upravím) ale z
$this->headingModule->title mi lezou řetězce s polámaným kódováním
i když všechno ostatní má kódování správné.
Inkriminovaný kód:
require_once './inc/texy/texy.php';
class Cache extends Texy
{
    var $cachePath ='/cache/';
    var $time;
    function __construct()
    {
        parent::__construct();
        // some configurations
#       $this->alignClasses['left'] = 'left';
#       $this->alignClasses['right'] = 'right';
        $this->headingModule->generateID = TRUE;                // generování ID k nadpisům
        $this->encoding = 'iso-8859-2';                                 // kódování v ISO-8859-2
        $this->setOutputMode(Texy::HTML4_TRANSITIONAL); // výstup: HTML4
        $this->htmlOutputModule->removeOptional = FALSE;// neodstraňovat volitelné značky
        $this->htmlOutputModule->baseIndent = 3;                // základní odsazení z leva: 3 znaky
        $this->htmlOutputModule->lineWrap = 120;                // zalomit řádek po 120 znacích
    }
    function process($text, $useCache = TRUE)
    {
        $this->time = -microtime(TRUE);
        if ($useCache) {
            $md5 = md5($text); // md5 is key for caching
            // check, if cached file exists
            $cacheFile =  dirname(__FILE__) . '/' . $this->cachePath . $md5 . '.cache';
            $content = is_file($cacheFile) ? unserialize(file_get_contents($cacheFile)) : NULL;
            if ($content) {         // read from cache
                list($html, $this->styleSheet, $this->headingModule->title) = $content;
            } else {                           // doesn't exists
                $html = parent::process($text);
                $handle = fopen('safe://'.$cacheFile, 'w');
                fwrite($handle, serialize( array($html, $this->styleSheet, $this->headingModule->title)));
                fclose($handle);
            }
        } else { // if caching is disabled
            $html = parent::process($text);
        }
        $this->time += microtime(TRUE);
        return $html;
    }
}
Pokud je chyba na mém přijímači tak se omlouvám a budu rád, když mě opravíte.
před 11 lety

- David Grudl
 - Nette Core | 6806
 
Interně Texy pracuje v UTF-8, takže jakákoliv proměnná, včetně
$this->headingModule->title je kódovaná v UTF-8.
před 11 lety

- TFSi
 - Člen | 23
 
To jsem si neuvědomil. Je nějaká možnost jak z toho vydolovat jiné kódování?
před 11 lety

- David Grudl
 - Nette Core | 6806
 
Jasně, můžeš to překódovat třeba do ISO 8859–2 funkcí iconv.
$title = iconv('UTF-8', 'ISO-8859-2', $this->headingModule->title);
Ne přímo Texy nabízí možnost:
// znaky, které v cílovém kódování nejsou, se nahradí podobným
$title = TexyUtf::utfTo($this->headingModule->title, 'ISO-8859-2');
nebo, pokud jde o výstup na web (který není v UTF-8), tak lze použít:
// znaky, které v cílovém kódování nejsou, se zapíší entitou
$title = TexyUtf::utf2html($this->headingModule->title, 'ISO-8859-2');
(Teď si všímám, že konzistentnější by bylo metodu pojmenovat utfToHtml, no nic…)
před 11 lety

- TFSi
 - Člen | 23
 
Perfektní! Mockrát díky :)