Autor Zpráva
Petroff
Profil
Potřebuji předat řetězec multilinestring (obsahující znaky \n) skriptu php:
JSloader.src="reqst.php?text="+multilinestring;
(v php převedu odřádkování na <br /> pomocí nl2br)
Bez konverze před odesláním (+ zpětná konverze v PHP) se odřádkování ztratí.
Nějaký jednoduchý způsob ???
vertigo4
Profil
Petroff
a proč to nepřevedeš až po předání?
Petroff
Profil
Bez úpravy dorazí do php:
$text="1.radek2.radek3.radek" znaky \n chybí
Měsíček
Profil
Tak jim tam pošli třeba znak # a potom ho převeď na \n
Petroff
Profil
multilinestring je obsah textarey f.txtA.value
Myslíš provést f.txtA.value.replace(/\n/g,"#"); ???
A co se znaky # obsažené v textu :-[
Měsíček
Profil
a \/n\/ ? na konci nahradit na \n?
los
Profil *
encodeURIComponent(f.txtA.value)
Petroff
Profil
Zkusím
a co zpět (neznám php funkční výbavu) ??
vertigo4
Profil
Petroff
tak to odřádkování převěd na nějaký číselný kod třeba 0125642975413238
Petroff
Profil
Zkusím se mrknout, jestli v php funkcích není eqiwalent js decodeURIComponent (zdá se, že těch znaků kromě \n bude víc)
Chamurappi
Profil
Reaguji na Petroffa:
Funkce encodeURIComponent zakóduje jakýkoliv řetězec do podoby, která je dovolená v URI — stejně, jako když se posílá cokoliv GETem (zkus si odeslat <form> s víceřádkovým <textarea>). Dekódování provádí server sám od sebe, žádnou speciální funkci nepotřebuješ.

Dej si ale pozor, aby výsledná URI nebyla moc dlouhá, Explorer má limit tuším někde kolem 2 kB, zbytek ořízne.
Petroff
Profil
Já ale form neodesílám z důvodu aby nedošlo k reloadu stránky. Jen využívám form.prvky k zadání jména a textu příspěvku.
Takže se o to zakódování musím postarat sám - v podstatě provádím toto:
<script src="xxx.php?add=true&jmeno='+f.jmeno.value+'&text='+zakoduj(f.text.va lue)>

Zkusil jsem použít encodeURIComponent(f.txtA.value) : scriptLoader.src = 'rqst.php?text='+encodeURIComponent(f.text.value);
a v PHP: $text = nl2br($text); echo "alert(\"\$text = $text\");";
Výsledek:
1řádkový text .... $text=ahoj => php provedl alert("$text = ahoj") )
2řádkový text .... [ERROR: unterminated string literal] [Break on this error] alert("$text = aaa<br />\n
Mám tam \n navíc a jsem tam kde jsem byl....ale zkusím ty \n odfiltrovat.
<To Chamurappi>
Jinak jsem zjistil že encodeURIComponent("\n") => %0A což je zakodovaný znak LF=chr10
Kdežto form odesílá GETem odřádkování (v textarea) jako %0D což je zakodovaný znak CR=chr13
Chamurappi
Profil
Reaguji na Petroffa:
src="xxx.php?add=true&jmeno='+f.jmeno.value+'&text='+zakoduj(f.text. value)"
I to jméno bys měl projet encodeURIComponentem.

Zkusil jsem použít encodeURIComponent
Což je dobře. Chtěl jsi ten konec řádku dostat do PHP — a to se povedlo.

a v PHP: $text = nl2br($text);
Tím převedeš konec řádku na <br> a to asi nechceš. Teď už nepotřebuješ protlačit kus textu od klienta přes adresní řádek do PHP, ale protlačit řetězec z PHP do řetězce v klientském skriptu. Tudíž na straně serveru musíš nahradit zpětná lomítka za „\\“, konce řádků za „\n“ a uvozovky za „\"“.
peta
Profil
Petroff
http://xkr.us/articles/javascript/encode-compare/
A to jeste je rozdil v utf-8 utf-7 a utf-16 pri kodovani do %. JS z toho zvlada maloco.
Petroff
Profil
<To Chamurappi>
Tudíž na straně serveru musíš nahradit zpětná lomítka za „\\“, konce řádků za „\n“ a uvozovky za „\"“.
Zjištěno [při použití xxx.src = 'xxx.php?text='+encodeURIComponent(f.textarea.value);] :
<TEXTAREA> [key]= Enter  \  "  ' 
( SERVER ) $text= ORD=10 \\ \" \'   

Ostatní znaky jsou OK = nezměněny (používám UTF-8)
<To Petroff>
Kdežto form odesílá GETem odřádkování (v textarea) jako %0D což je zakodovaný znak CR=chr13
MALÝ OMYL: odesílá dvojici %0D%0A
Chamurappi
Profil
Reaguji na Petroffa:
MALÝ OMYL: odesílá dvojici %0D%0A
Záleží na operačním systému. Windows používá na konec řádku CRLF (v JS "\r\n", hexadecimálně 0D0A), Unixy používají LF (v JS "\n", hexadecimálně 0A). Nějak si to sjednoť.

Zjištěno …
Funkce encodeURIComponent nikdy nedoplňuje zpětná lomítka. Nestará se o nic jiného, než aby byl řetězec zapsatelný do části URI bez změny svého významu. Děje se skoro přesně totéž, jako když pošleš formulář GETem. Takže z pohledu serveru zůstane konec řádku koncem řádku, lomítko lomítkem, uvozovka uvozovkou, apostrof apostrofem.

Co s tím dál dělá server a jak (či jestli) vrací ten GET parametr uživateli, to už není starost JS.
peta
Profil
Petroff
toto jsem kdysi delal
http://www.volny.cz/peter.mlich/Pr/URLchars.htm
kdyz ti nestaci vysvetleni na dane strance

To, co popisujes je problem textoveho retezce obecne, problem slashes, nema to nic spolecne s URL
\\
\'
\"
\n
\r
\t
\s
pokud chces mit \n v retezci je nutne pouzit
alert("\\n")
alert("\n")
alert("\\")
alert("\"")
Petroff
Profil
<To Chamurappi>
Tudíž na straně serveru musíš nahradit zpětná lomítka za „\\“, konce řádků za „\n“ a uvozovky za „\"“.
Tohle je klíčová info, díky.
Jsem v php zelenáč a konverze mi nakonec vyšla dost neohrabaně:
-----------------------------------------------------------------
<?php
function konv($s) {
$new = "";
for($i=0;$i<strlen($s);$i++) {
$o=ord($s[$i]);
$new.=($o==10)?"\\n":(($o==92)?"\\\\":(($o==34)?"\\\"":$s[$i]));
};
return $new;
}
/*******
Já pochopitelně data uložím do DB a z té je načtu a sestavím $ pro EL.innerHTML.
Zkusil jsem nahradit znaky \n řetězcem "<br />", funguje to ale zabírá víc místa v DB.
*******/
$text = htmlspecialchars($text);
$text= str_replace(array("\r\n","\n"),"<br />",$text);
/****
nelze použít nl2br, protože nechci mít quli přehlednosti HTML kodu navíc znaky \n
****/
mysql_query("INSERT INTO komentare VALUES ('', '$meno', '$text', ......)");
$vysledek=mysql_query("select * from komentare");
$html="";
while ($zaznam=MySQL_Fetch_Array($vysledek)):
$html="($zaznam[3])<strong>$zaznam[1]</strong><p>$zaznam[2]</p>\n" . $html; /* \n jen quli přehlednosti HTML kodu */
endwhile;

$html = konv($html);
?>
updateHTML("<?= $html ?>");
//alert("<?= $html ?>");
------------------------------------------------------------
(při načtení stránky sestaví HTML php skript jez účasti JS)
(dále při vyp.JS: form POST >> replace \n "<br />")

Vaše odpověď

Mohlo by se hodit

Neumíte-li správně určit příčinu chyby, vkládejte odkazy na živé ukázky.
Užíváte-li nějakou cizí knihovnu, ukažte odpovídajícím, kde jste ji vzali.

Užitečné odkazy:

Prosím používejte diakritiku a interpunkci.

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