Je zou echt moeten proberen alles van punt tot punt UTF-8 te maken.
Gebruik de juiste unicode-bewuste sortering voor database en tabel, ik geef altijd per tabel, zelfs als db-standaard al was opgegeven. Dit antwoord heeft veel mysql+java- en ook servlet-problemen, maar ze zouden de meeste problemen moeten beantwoorden die we moeten weten bij het ontwikkelen van unicode-bewuste java-applicaties.
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;
Gebruik jdbc-verbindingsreeks om unicode-vertaling te krijgen.
<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"
/>
Forceer Tomcat om karakterset van het inhoudstype te gebruiken voor zowel GET- als POST-parameterreeksen, dus pas het useBodyEncodingForURI-kenmerk toe voor http- en https-connectors (bestand tomcat/conf/server.xml).
<Connector port="8080"
maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" redirectPort="8443" acceptCount="100"
debug="0" connectionTimeout="20000"
disableUploadTimeout="true"
useBodyEncodingForURI="true"
/>
Zorg er aan het begin van elke servlet-pagina voor dat Tomcat-parsers parameters opvragen als utf-8. U moet setCharacterEncoding aanroepen voordat u parameters leest, anders is het te laat. De meeste webbrowsers verzenden geen charset-attribuut van het inhoudstype, dus servlet-engines kunnen het verkeerd raden.
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");
...
}
Wees voorzichtig met de .jsp-pagina, voeg geen lege leidende whitechars in of het kan te laat zijn om setCharacterEncoding aan te roepen, zie hoe ik tagmarkeringen aan het einde van elke rij plaats om whitechars te vermijden, ook hoe html-elementen vanaf de eerste regel beginnen. Jsp-tag contentType
gaat naar http-antwoord en pageEncoding
betekent hoe het bestand op een schijf wordt opgeslagen. Als u alleen een ISO-8859-15-teksteditor heeft en geen i18n-letters hardcodeert op een jsp-pagina, kunt u de juiste iso* pageEncoding kiezen.
<%@ 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>
Als u een xml-document op de jsp-pagina maakt, moet u de xml-header schrijven zonder leidende witte tekens of nieuwe regels. Zie hoe scriptlet-endtag en xml-header op dezelfde regel staan. Dit is waar ingesloten jsp-code altijd rekening mee moet houden, onschuldige leidende whitechar kan goed opgemaakte antwoorden verpesten.
<%@ 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>