Autor Zpráva
AM_
Profil
Zdravím,
narazil jsem na celkem divné chování: mám jednoduché fórum a v něm úplně obyčejný formulář s textareou (nebo i inputtextem, chová se to stejně) a když ho odešlu na server, "obyčejné" znaky jako &, " se na entity nepřeloží (také proč by se překládaly), z nějakého důvodu se ale přeloží ty "hodně neobvyklé" jako │, ☺ atd. Pak to samozřejmě dělá bordel, protože kvůli těm "obyčejným" znakům se vstup musí prohnat htmlspecialchars a tyhle speciální znaky se pak zobrazí jako kódy entit, protože jsou vlastně escapované dvakrát. Nevíte, proč se toto děje? Nedá se tomu nějak elegantně zabránit/vyřešit to? Rád bych se vyhnul krkolomnému řešení jako např. pomocí regulárů vyhledávat všechny takto escapované záležitosti a odescapovávat je zpátky, a pak teprve volat htmlspecialchars.
Díky.
Majkl578
Profil
Zajímavé. Mně se to neděje.
Použil jsem:
<?php
var_dump($_POST);
?>
<form method="post">
    <textarea name="x"></textarea><input type="submit">
</form>
A obsahy "│☺" a "ވާހަކަދައްކާތަން" přišly nepoškozeny.
AM_
Profil
Majkl578:
No na stránce to nevidíš, protože prohlížeč ty entity zobrazí jako znaky. Ale podívej se do zdrojáku nebo si zkus tohle:
<?php
if (!empty($_POST)){
  header('content-type:text/plain');
  var_dump($_POST);
  die();
}
?>
<form method="post">
    <textarea name="x"></textarea><input type="submit">
</form>
Majkl578
Profil
AM_:
To je mi jasné, koukal jsem se do zdrojáku. Zkusil jsem i ten tvůj kód a stále se to chová jak má (žádné entity).
array(1) {
  ["x"]=>
  string(6) "│☺"
}
Chamurappi
Profil
Reaguji na AM:
z nějakého důvodu se ale přeloží ty "hodně neobvyklé"
To jsem též před nějakou dobou zjistil.
Nejde o to, že jsou hodně neobvyklé, překládají se, protože prohlížeč komunikuje se serverem ve stejném kódování, v jakém je načítána stránka, a tyto znaky v dotyčném kódování nejsou. Mohl by je úplně vyhodit, ale místo toho je zapíše entitou (většinou číselnou, Explorer někdy i jmennou).

Nedá se tomu nějak elegantně zabránit/…?
Použij Unicode.

…/vyřešit to?
Jiné řešení neexistuje, protože na serveru už nemáš šanci poznat, jestli uživatel zadal smajlíka, nebo jestli napsal doslova &#9786;.


Reaguji na Majkla578:
Mně se to neděje.
Protože užíváš Unicode.

obsahy "│☺" a "ވާހަކަދައްކާތަން" přišly nepoškozeny
Do této diskuse (užívající ISO-8859-2) přišly jako "&#9474;&#9786;" a "&#1928;&#1959;&#1920;&#1958;&#1926;&#1958;&#1931;&#1958;&#1927;&#1968;&#1926;&#1959;&#1932;&#1958;&#1922;&#1968;" — jsou tak uložené i v databázi, protože v číselných entitách nenahrazujeme & za &amp;. Entitami jsou tu zapsané na příklad i typografické uvozovky.
AM_
Profil
Chamurappi:
Jedná se o problém na jednom starším webu, kde jsem ještě používal win1250, kvůli uživatelům, co mají potřebu se podepsat 1337speakem to přepisovat nebudu :) udělám tedy nějaký podobný workaround:
protože v číselných entitách nenahrazujeme & za &amp;
což jde dost jednoduše přes regulár.

Díky za pomoc :)
Chamurappi
Profil
Reaguji na AM:
udělám tedy nějaký podobný workaround
Ještě je jedna možnost (složitější a s úskalími, která tam nezmiňuji).
AM_
Profil
Chamurappi:
Díky, vyřešil jsem to přes ten regulár, pro potřeby onoho webu to stačí.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0