BUG: Rozhozené UTF-8 v šablonách

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
honzajavorek
Člen | 57
+
0
-

Ahoj, celé dopoledne se dnes trápím s jednou chybou a nakonec to vypadá na chybu v Nette. Pravděpodobně jsou na vině nedávné změny v Nette\Templates. Mám dva weby jedoucí na Nette (tedy zatím na localhostu :D ), v jednom jsem měl funkční RSS a v druhém ho zrovna programuji. Problém nastal, když jsem zjistil, že v novém mi Nette rozhazuje kódování – vše je v UTF-8, ale přesto mi vygeneruje dost podivné znaky místo diakritiky. Simulovat problém by mělo jít nějak takto:

Presenter

$this->template->title = $this->template->description = 'ěščřžýáíéůú...';

Template

{contentType application/rss+xml; charset=utf-8}
<<?php ?>?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
	<channel>
		<title>{$title}</title>
		<description>{$description}</description>

		...

	</channel>
</rss>

Když odeberu část {contentType application/rss+xml; charset=utf-8}, zobrazí se kódování správně. Taky když zapíšu hodnoty bez escapování jako {!$title}. Každopádně jsem se s tím opravdu trápil půl dne a pak už jsem se naštval a začal jsem co nejvíce simulovat situaci ze staršího webu, kde to jede… až jsem narazil na to, že v tom mám starší verzi Nette. A opravdu :) . Ve starší verzi to jede v pořádku, v novější stažené z webu nebo přímo z SVN tento zápis kódování rozhazuje. Feature nebo bug? Přehlédl jsem nějaké novinky v nastavení? Příklad v distribuci (skeleton) vypadá prakticky totožně… Nezkoušel jsem ho, ale podle mě taky nepojede.

kravčo
Člen | 721
+
0
-

Problém je vo funkcii TemplateHelpers::escapeXml(), ktorá vymazáva z XML stringu nepovolené znaky, no neberie do úvahy možné utf-8. Tým pádom vymazáva niektoré bajty z platných viacbajtových utf-8 znakov.

U mňa to vyriešilo pridanie modifikátora u k pcre patternu:

public static function escapeXML($s)
{
    ... preg_replace('#[\x00-\x08\x0B\x0C\x0E-\x1F\x7F-\x84\x86-\x9F]+#u', '', $s) ...
}

Neviem, či v takomto prípade má časť [\x7F-\x84\x86-\x9F] v patterne vôbec zmysel , asi ju bude treba tiež nejako prepísať aby bola funkčná ako treba. Navyše pri inom ako utf-8 kódovaní to bude asi ešte zaujímavejšie :)

David Grudl
Nette Core | 8144
+
0
-

Aj, pravda, chybí tam pro UTF-8 u. Přemýšlím, jak vyřešit podporu pro jiné kódování obecně (že by helper dostával informaci, v jakém kódování je vstup?) a nejjednodušší asi bude ji neřešit – Nette obecně rádo UTF-8.

V tomto případě ale asi přestanu odstraňovat znaky x80-x9F, beztak jsou v XML 1.0 povolené.

honzajavorek
Člen | 57
+
0
-

To je hrozný :D . Na jedné straně vesmíru člověk zapomene jeden pitomý bajt a na druhé straně si kvůli tomu jiný půl dne trhá vlasy a kontroluje kódování už snad i obalů od mlíka… Jestli se v pravěku neměli líp… Díky za fix :) .