Du burde virkelig prøve at lave alt UTF-8 fra punkt til punkt.
Brug passende unicode-bevidst kollation til database og tabel, jeg giver altid pr. tabel, selvom db default allerede var givet. Dette svar har en masse mysql+java og også servlet-problemer, men de burde besvare de fleste problemer, vi har brug for at vide, når vi udvikler unicode-bevidste java-applikationer.
CREATE DATABASE mydb DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_swedish_ci;
CREATE TABLE tMyTable (
id int(11) NOT NULL auto_increment,
code VARCHAR(20) NOT NULL,
name VARCHAR(20) NOT NULL,
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_swedish_ci;
Brug jdbc-forbindelsesstrengen til at have unicode-oversættelse.
<Resource name="jdbc/mydb" auth="Container" type="javax.sql.DataSource"
maxActive="10" maxIdle="2" maxWait="10000"
username="myuid" password="mypwd"
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/mydb?useUnicode=true&characterEncoding=utf8"
validationQuery="SELECT 1"
/>
Tving Tomcat til at bruge indholdstypetegnsæt til både GET- og POST-parameterstrenge, så anvend useBodyEncodingForURI-attributten for http- og https-forbindelser (tomcat/conf/server.xml-fil).
<Connector port="8080"
maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" redirectPort="8443" acceptCount="100"
debug="0" connectionTimeout="20000"
disableUploadTimeout="true"
useBodyEncodingForURI="true"
/>
Ved starten af hver servlet-side skal du sørge for, at Tomcat-parsere anmoder om parametre som utf-8. Du skal kalde setCharacterEncoding, før du læser parametre, ellers er det for sent. De fleste webbrowsere sender ikke indholdstype-charset-attribut, så servlet-motorer kan gætte det forkert.
public void doGet(HttpServletRequest req, HttpServletResponse res)
throws ServletException { doPost(req, res); }
public void doPost(HttpServletRequest req, HttpServletResponse res)
throws ServletException {
if (req.getCharacterEncoding() == null)
req.setCharacterEncoding("UTF-8");
String value = request.getParameter("fieldName");
...
}
Vær forsigtig med .jsp-siden, indsæt ikke tomme ledende hvide tegn, ellers kan det være for sent at kalde setCharacterEncoding, se hvordan jeg sætter tag-markører i slutningen af hver række for at undgå hvide tegn, også hvordan html-elementer starter fra første linje. Jsp-tag contentType
går til http-svar og pageEncoding
betyder, hvordan filen er gemt på en disk. Hvis du kun har ISO-8859-15 teksteditor og ikke hardkoder i18n-bogstaver på en jsp-side, kan du vælge den korrekte iso*-sidekodning.
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %><%@
taglib prefix="x" uri="http://java.sun.com/jsp/jstl/xml" %><%@
page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"
import="java.util.*,
java.io.*
"
%><%
if (req.getCharacterEncoding() == null)
request.setCharacterEncoding("UTF-8");
String param1 = request.getParameter("fieldName");
%><!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Page Title</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<meta name="keywords" content="some,fine,keywords" />
</head>
<body>
your html content goes here.... <%= param1 %>
</body>
</html>
Når du opretter et xml-dokument på en jsp-side, skal du skrive xml-header uden ledende hvide tegn eller linjeskift. Se, hvordan scriptlet-endtag og xml-header er på samme linje. Dette er, hvad indlejret jsp-kode altid skal tage i betragtning, uskyldige ledende hvidtegn kan ødelægge velformaterede svar.
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %><%@
page contentType="text/xml; charset=UTF-8" pageEncoding="ISO-8859-1"
import="java.util.*,
java.io.*
"
%><%
// MyBean has getId() and getName() getters
List<MyBean> items = new ArrayList<MyBean>();
items.add( new MyBean(1, "first") );
items.add( new MyBean(2, "second") );
items.add( new MyBean(3, "third") );
pageContext.setAttribute("items", items);
%><?xml version="1.0" encoding="UTF-8"?>
<mydoc>
<c:forEach var="item" items="${items}">
<item>
<id>${item.id}</id>
<name>${item.name}</name>
</item>
</c:forEach>
</mydoc>