Muppigt var det här. Tomcat bråkar med mig och vill inte läsa GET parametrar med rätt charset (UTF-8) utan envisas med att använda 8859-1. Kan man ställa in Tomcat på nåt sätt så att den gör rätt, eller hur hanterar man bäst att servrar gör olika?
Tomcat läser GET parametrar med fel charset
5 svar · 633 visningar · startad av dAEk
Dels kan du ställa vilket default charset du använder i både TC och JVM:en och sedan går det också att deklarera detta i de anrop som görs genom att sätta sidans charset.
Antingen gör du det i header-taggen med "contenttype=text/html charset=UTF-8" eller med JSP-tagen page (se http://java.sun.com/products/jsp/tags/11/syntaxref11.fm7.html).
Jo, jag vet att man ska sätta charset i http headern. Det är inte det som är felet, men tack ändå. ;)
Kolla på följande exempel, testkör gärna och skriv i lite grejs i textfältet och skicka iväg formuläret. Skriv text som innehåller tecken utöver a-z0-9, till exempel "ölglas är aldrig passé" eller "ölglas für alles!" så kommer du se vad jag menar. Nånting är knas, eller?
<%@page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
<%@page import="java.net.URLEncoder"%>
<%@page import="java.net.URLDecoder"%>
<%
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
String messageParam = request.getParameter("message");
String queryString = request.getQueryString();
if (messageParam == null) messageParam = "";
%>
<!doctype html>
<html>
<head>
<title>GET</title>
</head>
<body>
<div>
<ul>
<li>QueryString: <%= queryString %></li>
<li>messageParam: <%= messageParam %></li>
<li>URLEncoder.encode(messageParam, "UTF-8"): <%= URLEncoder.encode(messageParam, "UTF-8") %></li>
<li>URLDecoder.decode(messageParam, "UTF-8"): <%= URLDecoder.decode(messageParam, "UTF-8") %></li>
</ul>
<form action="" method="get">
<input type="text" name="message" value="<%= messageParam %>">
<input type="submit">
</form>
</div>
</body>
</html>
Använder jag nåt i stil med
String messageParam = request.getParameter("message");
String message = new String(messageParam.getBytes("8859_1"), "UTF-8");
visas texten okej men vad händer om man deployar appen på en server som inte behöver denna fix? Eller kör alla servrar med 8859-1 (som jag antar att TC verkar använda sig av) med bakåtkompatibilitet i åtanke?
Me be confused.
Av någon keff anledning finns det inget standardmässigt sätt att säga åt en servletmotor hur den ska avkoda indata, och defaulten kommer förstås från den gamla onda tiden, när Latin-1 användes till allt. Så ja, standard är ISO-8859-1, men det betyder inte att det är rätt. Vill man använda UTF-8 i Tomcat fixar man det via server.xml, se t.ex. http://confluence.atlassian.com/display/DOC/Configuring+Tomcat's+URI+encoding
PS. Den enda korrekta teckenuppsättningsteststrängen är "François och Niños räksmörgåscafé" ;)
Ja, man önskar ju att det gick att göra som det går att göra i Weblogic och använda input-charset taggen.
Ex:
<input-charset>
<resource-path>/foo</resource-path>
<java-charset-name>UTF-8</java-charset-name>
</input-charset>
Jaha, där ser man. Det var som jag misstänkte. Jobbigt att ana problem men inte veta hur man ska ta sig förbi dem. ;)
Har testat med URIEncoding="UTF-8" i server.xml och nu rullar det som det ska. Sjyst att det fanns en enkel fix.
Tack så mycket för hjälpen!