BUG: Rozhozené UTF-8 v šablonách
- honzajavorek
- Člen | 57
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
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 | 8228
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
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 :) .