Portál AbcLinuxu, 13. května 2025 22:45

Dotaz: Java : HTTP POST v ruznych kodovanich

8.5.2010 14:53 Tomas
Java : HTTP POST v ruznych kodovanich
Přečteno: 476×
Odpovědět | Admin
Zdravim,

potrebuji v Jave napsat kod ktery pres HTTP odesle POST. V postu jsou textove informace s diakritikou. Script ktery prijima formular miva kodovani UTF-8 nebo ISO 8859-2. Uz mi dochazi napady jak telo onoho POSTu sestavit. Zkousel jsem vse, co jsem kde precetl.

Spravna cesta by podle me byla :

Nevite jak presne, postupovat pri kodovani POSTu, nebo nemate fungujici kus kodu?

Diky Tomas.
Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

8.5.2010 16:36 Filip Jirsák | skóre: 68 | blog: Fa & Bi
Rozbalit Rozbalit vše Re: Java : HTTP POST v ruznych kodovanich
Odpovědět | | Sbalit | Link | Blokovat | Admin
Nejjednodušší je podle mne použít nějakou knihovnu, třeba HttpClient.

Pokud chcete požadavek sestavovat ručně, měl by váš postup být správně, ale chybně máte první řádek. Za prvé, v Javě pracujete s textem (s řetězcem), takže je nesmysl mluvit o nějakém kódování – kódování se týká jen serializace nebo deserializace z/do bajtů. Takže pokud potřebujete do těla POSTu předávat „text v kódování ISO-8859-2“, znamená to předávat tam pole bajtů, které představují text v daném kódování – výsledkem kroku 1 tedy nemůže být String, ale byte[]. Takže v prvním řádku byste měl volat jen val.getBytes("ISO 8859-2"). Mimochodem, metoda getBytes() a konstruktor new String() bez určeného kódování použijí kódování platformy (tj. na Windows kódování pro danou jazykovou mutaci Windows, na unixech kódování nastavené v locale), a pokud to někde v kódu uvidíte nebo použijete, je to skoro vždy špatně.
8.5.2010 19:01 Tomas
Rozbalit Rozbalit vše Re: Java : HTTP POST v ruznych kodovanich

Diky za pomoc.

Sam jsem citil, ze mit to cele ve stringu nebude spravne.

Co se tyce HttpClient, ten jsem pouzival bohuzel ani v nem to kodovani nedokazu zprovoznit.

V hlavicce ze serveru mi prijde nasledujici :

  • Vary: Accept-Encoding
  • Content-Encoding: gzip

V tele HTML dokumentu je kodovani ISO 8859-2.

Rozumim tomu spravne, ze POST na server ma mit telo v kodovani ISO 8859-2?

Jak k tomu dospet?

  • Ziskat retezce k odeslani (String)
  • Vytvorit telo POSTu pomoci URLEncoder.encode("ISO 8859-2") (String)
  • do output streamu vlozit pole bytu : os.write(telo.getBytes("ISO 8859-2");

URL encode necha normalni znaky jako a..z A..Z napokoji. Vyescapuje specialni znaky jako mezery, enter, zavinac ... . Navic vezme specialni znaky(diakriticke) a ty zakoduje podle tabulky pro zvolene kodovani.

Kdyz se divam, co tam posila FF, tak je obsah pekne zakodovany %40 @ %26 ř atp. Z Javy se mi cela diakritika zakoduje znak '?'

Napada nekoho neco?

8.5.2010 19:14 Filip Jirsák | skóre: 68 | blog: Fa & Bi
Rozbalit Rozbalit vše Re: Java : HTTP POST v ruznych kodovanich
U knihovny HttpClient by snad mělo stačit v konstruktoru UrlEncodedFormEntity předat správné kódování.

Řetězec tvořící tělo POSTu musíte podle mne poskládat z jednotlivých částí, URLEncoder.encode() by vám zakódovalo i oddělovače jednotlivých parametrů (&). Ve výsledném řetězci by pak měly být jen znaky z ASCII, takže do výstupu byste měl vypsat os.write(telo.getBytes("ASCII"); (ale pokud tam máte správně jen ASCII znaky, nebud v tom rozdíl).

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.