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