[Java/Servlet] encoding van post parameters

Pagina: 1
Acties:

  • ari3
  • Registratie: Augustus 2002
  • Niet online
Ik heb een servlet waarmee ik unicode strings uit HTTP post parameters wil verwerken. Het HTML formulier heeft als content-type "text/html; charset=UTF-8". Het probleem doet zich voor dat als een parameter gelezen wordt met:
Java:
1
request.getParameter("naam");

De geretourneerde string blijkt niet gecodeerd te zijn als UTF-8. Als mogelijke oplossing heb ik in het form-element een het attribuut accept-charset opgenomen:
HTML:
1
<form action="servlet" method="post" accept-charset="UTF-8">

Het volgende is ook vreemd:
Java:
1
request.getCharacterEncoding();

Bovenstaande retourneert null. Het lijkt er op dat accept-charset niet gehonoreerd wordt?

Een mogelijke, maar ongewenste, workaround voor dit probleem is het opnieuw coderen van de String in UTF-8.
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
    // lelijke workaround voor het parameter encoding probleem
    private String toUTF8(String raw) {
        BufferedReader reader = null;
        String result = null;
        try {
            reader = new BufferedReader(new InputStreamReader(new StringBufferInputStream(raw), "UTF-8"));
            result = reader.readLine();
        } catch (UnsupportedEncodingException e) {
            logger.error(e);
        } catch (IOException e) {
            logger.error(e);
        }
        return result;
    }
Vraag is dus: Hoe zorg ik dat getParameter() een string retourneert gecodeerd in UTF-8, zonder dat ik de bovenstaande workaround hoef gebruiken?

[ Voor 5% gewijzigd door ari3 op 13-05-2004 14:33 ]

"Kill one man, and you are a murderer. Kill millions of men, and you are a conqueror. Kill them all, and you are a god." -- Jean Rostand


Verwijderd

Volgens mij moet je ook een enctype="UTF-8" attribute toevoegen aan je form,
anders wordt de encoding van je POST niet aangepast.

Die workaround heeft geen zin omdat je niet vanuit de binaire data werkt.
De conversie van bytes naar string is al gedaan.

request.getCharacterEncoding(); returns null als het de default encoding betreft volgens de servlet spec.

  • ari3
  • Registratie: Augustus 2002
  • Niet online
Verwijderd schreef op 14 mei 2004 @ 10:13:
Volgens mij moet je ook een enctype="UTF-8" attribute toevoegen aan je form,
anders wordt de encoding van je POST niet aangepast.
Het enctype is standaard "application/x-www-form-urlencoded". Dit zegt niets over de manier waarop een string gecodeerd wordt. Ik vond deze link waar Sun e.e.a. toelicht.
Die workaround heeft geen zin omdat je niet vanuit de binaire data werkt.
De conversie van bytes naar string is al gedaan.
Klopt. Het gaat alleen goed als de (platform-afhankelijke) standaardcodering toevallig ISO-8859-1 of een andere 8-bits codering is.
request.getCharacterEncoding(); returns null als het de default encoding betreft volgens de servlet spec.
Nee, het retourneert null als de browser geen encoding heeft meegestuurd in het request. Zie de JavaDoc.


Bij gebrek aan ondersteuning van het accept-charset attribuut heb ik het nu als volgt geïmplementeerd:
Java:
1
2
   if (request.getCharacterEncoding() == null)
       request.setCharacterEncoding("UTF-8");


Bovenstaande moet worden uitgevoerd voordat getParameter() wordt gebruikt. Hierdoor zal getParameter alleen nog String retourneren met UTF-8 als codering.

"Kill one man, and you are a murderer. Kill millions of men, and you are a conqueror. Kill them all, and you are a god." -- Jean Rostand