Ano, je lepší to udělat před dekódováním, tohle mi nedošlo.
Taky je pravda, že může být více parametrů stejného jména, takže tady je lepší 
verze :-)

public static HashMap<String, List<String>> parseURIQuery(URI uri) throws 
UnsupportedEncodingException {
        HashMap<String, List<String>> map = new HashMap<String, List<String>>();
        String query = uri.getRawQuery();
        for (String s : query.split("&")) {
            String[] par = s.split("=");
            String key = URLDecoder.decode(par[0], "utf-8");
            String value = (par.length > 1) ? URLDecoder.decode(par[1], 
"utf-8") : "";
            List<String> strings = map.get(key);
            if (strings == null) {
                strings = new ArrayList<String>();
                map.put(key, strings);
            }
            strings.add(value);
        }
        return map;
    }

    public static void main(String[] args) throws URISyntaxException, 
UnsupportedEncodingException {

        String jedovate = URLEncoder.encode(".=&š", "utf-8");
        URI uri = new URI("http://www.neco.cz/hu?a=1&b=c+2%20d&d&b="; + 
jedovate);
        System.out.println("uri: " + uri.toString());

        HashMap<String, List<String>> map = parseURIQuery(uri);

        System.out.println("map = " + map);
    }

Makub

Lukáš Zapletal napsal(a):
> Dotaz:
> 
>   String[] par = URLDecoder.decode(s,"utf-8").split("=");
> 
> neni bezpecnejsi udelat rozdeleni podle rovnitka uz pred dekodovanim?
> Teoreticky by mohl byt v klici znak rovnitka, tudiz by doslo k chybne
> interpretaci. Tj.
> 
>   String sss[] = s.split("=")
>   String par0 = URLDecoder.decode(sss[0],"utf-8");
>   String par1 = URLDecoder.decode(sss[1],"utf-8");
> 
> LZ
> 
> 
> Dne 20. říjen 2008 11:15 Martin Kuba <[EMAIL PROTECTED]> napsal(a):
>> Lukáš Zapletal napsal(a):
>>> Zdravim,
>>>
>>> potreboval bych najit v Java Core API kod, ktery mi z URI.getQuery
>>> (resp. getRawQuery) vrati nejakou mapu nebo neco, abych si mohl cist
>>> jednotlive parametry. Nechce se mi to (parser) psat, nebo pouzit cizi
>>> kod. Vim, ze je to trivialni, ale musely by se napsat testy a zcela
>>> jiste by to nejaky cas trvalo. Urcite to nekde uz je hotove (minimalne
>>> v Servlet API), jen bych potreboval nasmerovat, kde :-)
>> K tomuto jednu poznámku - není definováno, jak jsou parametry odděleny,
>> takže taková metoda nemůže být univerzální.
>>
>> RFC 3986 definující URI parametry nedefinuje.
>>
>> Ve specifikaci HTML je uvedeno, že prohlížeče mají data z HTML formulářů
>> posílat ve tvaru parametr=hodnota oddělené znakem &
>> (viz http://www.w3.org/TR/REC-html40/interact/forms.html#h-17.13.4)
>> ale ve stejné specifikaci je na jiném místě napsáno,
>> že parametry předávané v URI by měly používat něco jiného
>> než &, nejlépe středníky ;, viz
>> http://www.w3.org/TR/REC-html40/appendix/notes.html#h-B.2.2
>>
>> Z tohoto zmatku vyplynulo, že server-side frameworky používají
>> jako oddělovač &, protože to posílají prohlížeče z formulářů
>> předávaných GET. Ale jsou vývojáři (třeba u nás vývojáři IS MU),
>> kteří používají v URL jako oddělovač zásadně středníky
>> (parsují parametry totiž ručně v Perlu).
>>
>> Čili nelze se obecně spolehnout na to, že parametry v URI
>> budou mít určitý oddělovač. Pokud se rozhodnete, že chcete
>> povolit jenom ampersandy, pak by mělo stačit
>>
>>
>>    public static HashMap<String, String> parseURIQuery(URI uri) throws 
>> UnsupportedEncodingException {
>>        HashMap<String,String> map = new HashMap<String, String>();
>>        String ss = uri.getQuery();
>>        for(String s: ss.split("&")) {
>>            String[] par = URLDecoder.decode(s,"utf-8").split("=");
>>            map.put(par[0],par.length>1?par[1]:"");
>>        }
>>        return map;
>>    }
>>
>>    public static void main(String[] args) throws URISyntaxException, 
>> UnsupportedEncodingException {
>>
>>        URI uri = new URI("http://www.neco.cz/hu?a=1&b=c+2%20d&d";);
>>
>>        HashMap<String, String> map = parseURIQuery(uri);
>>
>>        System.out.println("map = " + map);
>>    }
>>
>> Jo, ještě taky URI nemají definováno kódování, ale utf-8 je doporučeno.
>>
>>
>> Makub
>> --
>> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>> Supercomputing Center Brno             Martin Kuba
>> Institute of Computer Science    email: [EMAIL PROTECTED]
>> Masaryk University             http://www.ics.muni.cz/~makub/
>> Botanicka 68a, 60200 Brno, CZ     mobil: +420-603-533775
>> --------------------------------------------------------------
>>
>>
> 
> 
> 


-- 
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Supercomputing Center Brno             Martin Kuba
Institute of Computer Science    email: [EMAIL PROTECTED]
Masaryk University             http://www.ics.muni.cz/~makub/
Botanicka 68a, 60200 Brno, CZ     mobil: +420-603-533775
--------------------------------------------------------------

Attachment: smime.p7s
Description: S/MIME Cryptographic Signature

Odpovedet emailem