cURL wrapper: POST- lze změnit charset/encoding
- bojovyletoun
- Člen | 667
Ahoj, měl bych spíš takový obecný dotaz ohledně odesílání formulářů přes cURL wrapper.
Situace: přes cURL odesílám formulář.
$cu = new Curl\Request();
$re=$cu->post("http:...",array("prom"=>"č");
Pokud stránku otevírám „v prohlížeči“- bez curl, tak se formulář odešle OK („č“). tedy nějak takto:
POST /admin.php HTTP/1.1
User-Agent:
Host:
Accept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1
Accept-Language: cs-CZ,en;q=0.9,cs;q=0.8
Accept-Charset: iso-8859-1, utf-8, utf-16, *;q=0.1
Accept-Encoding: deflate, gzip, x-gzip, identity, *;q=0
Referer:
Cookie:
Cookie2:
Connection:
TE:
Content-Length:
Content-Type: application/x-www-form-urlencoded
prom=%E8&x=&y=z
Pokud toto zkusím, přes curl, tak se zakoduje takto: (např:„ÄŤ“) (POZOR! kodovani zdrojaku je UTF-8)
POST /admin.php HTTP/1.1
User-Agent:
Host:
Accept: */*
Cookie:
Content-Length:
Content-Type: application/x-www-form-urlencoded
prom=%C4%8D&...
! POKUD je kodovani zdrojaku cp1250, je to OK (poslední řádek je prom=%E8 ). („č“)
Otázky:
- odkud prohlížeč (a curl) pozná, jaké zvolit kodovani
- jak poslat dotaz s post daty v konretnim kodovani
- lze poslat data v jiném kodovani (muj pripad utf-8), ale jak to rici serveru. (zkoušel jsem content-transfer-encoding bez úspěchu)
- je možné, že by to (předešlý bod) na tomto konkretnim serveru nefungovalo?
Co vlastně bylo cílem? Jen poslat pár dat, ale převod zdrojáku do cp1250 bylo sice rychlé, ale adirty solution. Mě zajímá, na jaké vrstě kodovani změnit( curl, při tvorbě array(„prom“=>encodeXYZ(„č“))
Editoval bojovyletoun (13. 12. 2010 16:49)
- Filip Procházka
- Moderator | 4668
Asi by nebylo od věci to prohnat přes rawurlencode
.
Prohlížeč si to kóduje nějak sám inteligentně, to že to dotyčný web nezvládne je zase jiná věc, ale url by myslím měla být v pořádku i s diakritikou.
Proč cpeš do url diakritiku? :D
- bojovyletoun
- Člen | 667
asi mi to teď nepálí o půlnoci, ale chci se zeptat
- do url diakritiku? je to post…
- .rawurlencode vychází z předpokladu, že to posílám v url?
Editoval bojovyletoun (14. 12. 2010 0:41)
- Filip Procházka
- Moderator | 4668
Aha, promiň moc jsem si neprohlížel kód v úvodním příspěvku…
Ono asi jde o to, že pokud cílový web není v utf-8 tak příjme špatná data. Protože ty to z UTF8 scriptu pošleš v dvoubajtovém formátu.
Zkusil bych něco takového:
$data = array('prom'=>'č');
// všecko převedu do kódování cílového webu
$data = array_walk_recursive($data, function (&$item, $key, $encoding){
$item = iconv('UTF-8', $encoding, $item);
}, 'CP1250');
// všecko pošlu
$cu = new Curl\Request();
$re = $cu->post("http://example.com", $data);
// Edit: popřemýšlím o přidání podpory pro korekturu kódování. mohl bys otestovat jestli tohle funguje?
Editoval HosipLan (14. 12. 2010 16:21)
- kravčo
- Člen | 721
bojovyletoun napsal(a):
Ahoj, měl bych spíš takový obecný dotaz ohledně odesílání formulářů přes cURL wrapper.
Situace: přes cURL odesílám formulář.
$cu = new Curl\Request(); $re=$cu->post("http:...",array("prom"=>"č");
…
PHP string sa berie tak ako ho napíšeš, keď máš zdroják v UTF-8 pošle „č“ v UTF-8, ak ho máš win1250, pošle ho tak. Ak chceš posielať diakritiku vo win1250 posielaj ju v tej znakovej sade, ktorú očakávaš na druhej strane…
$cu = new Curl\Request();
$re=$cu->post("http:...",array("prom"=>"\xE8");
- bojovyletoun
- Člen | 667
jo, ten převod funguje
takže důvodem je, že stránka do prohlížeče dorazila v cp1250. ověřil
jsem si to, pokud, v browseru změním na jiné, tak se to mění. takže
v curlu se použije getcharset a potom ta transformace.