Oznámení

Provoz fóra byl ukončen

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 :)