Autor | Zpráva | ||
---|---|---|---|
AM_ Profil |
#1 · Zasláno: 8. 4. 2010, 08:58:25
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 |
#2 · Zasláno: 8. 4. 2010, 09:08:44
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> |
||
AM_ Profil |
#3 · Zasláno: 8. 4. 2010, 09:17:33
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 |
#4 · Zasláno: 8. 4. 2010, 09:23:09 · Upravil/a: Majkl578
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 |
#5 · Zasláno: 8. 4. 2010, 09:29:45
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 & . Entitami jsou tu zapsané na příklad i typografické uvozovky.
|
||
AM_ Profil |
#6 · Zasláno: 8. 4. 2010, 10:21:53
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 &“ což jde dost jednoduše přes regulár. Díky za pomoc :) |
||
Chamurappi Profil |
#7 · Zasláno: 8. 4. 2010, 10:58:02
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 |
#8 · Zasláno: 8. 4. 2010, 10:59:48
Chamurappi:
Díky, vyřešil jsem to přes ten regulár, pro potřeby onoho webu to stačí. |
||
Časová prodleva: 14 let
|
0