webForumDet fria alternativet

Tomcat läser GET parametrar med fel charset

5 svar · 633 visningar · startad av dAEk

dAEkMedlem sedan feb. 20041 816 inlägg
#1

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?

LimeMedlem sedan sep. 2001961 inlägg
#2

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).

dAEkMedlem sedan feb. 20041 816 inlägg
#3

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.

spangoMedlem sedan juni 20008 205 inlägg
#4

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é" ;)

LimeMedlem sedan sep. 2001961 inlägg
#5

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>

dAEkMedlem sedan feb. 20041 816 inlägg
#6

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!

136 ms totalt · 3 externa anrop · v20260731065814-full.fb544a5a
133 ms — hämta forumlista (db)
0 ms — hämta statistik (cache)
129 ms — hämta tråd, inlägg och bilagor (db)