cURL wrapper: POST- lze změnit charset/encoding

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
bojovyletoun
Člen | 667
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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.