Mysql
 sql >> Database >  >> RDS >> Mysql

Caratteri non inglesi nel database utilizzando Java

Dovresti davvero provare a fare tutto UTF-8 da un punto all'altro.

Usa le regole di confronto appropriate per unicode per database e tabelle, fornisco sempre per tabella anche se db default era già stato specificato. Questa risposta ha molti problemi con mysql + java e anche con servlet, ma dovrebbero rispondere alla maggior parte dei problemi che dobbiamo conoscere quando si sviluppano applicazioni java compatibili con unicode.

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;

Usa la stringa di connessione jdbc per avere la traduzione unicode.

<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"
/>

Forza Tomcat a utilizzare il set di caratteri del tipo di contenuto per le stringhe di parametri GET e POST, quindi applica l'attributo useBodyEncodingForURI per i connettori http e https (file 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"
/>

All'inizio di ogni pagina del servlet assicurati che i parser Tomcat richiedano parametri come utf-8. Devi chiamare setCharacterEncoding prima di leggere i parametri o è troppo tardi. La maggior parte dei browser Web non invia l'attributo del set di caratteri del tipo di contenuto, quindi i motori di servlet potrebbero indovinarlo in modo errato.

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");
   ...
}

Fai attenzione con la pagina .jsp non inserire un whitechars iniziale vuoto o potrebbe essere troppo tardi chiamare setCharacterEncoding, guarda come metto i marcatori di tag alla fine di ogni riga per evitare eventuali whitechar, anche come gli elementi html iniziano dalla prima riga. Tag Jsp contentType va a http response e pageEncoding significa come il file viene archiviato su un disco. Se disponi solo dell'editor di testo ISO-8859-15 e non esegui l'hardcoding di lettere i18n in una pagina jsp, puoi scegliere la corretta iso* pageEncoding.

<%@ 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>

Creando un documento xml nella pagina jsp è necessario scrivere l'intestazione xml senza caratteri bianchi o newline iniziali. Guarda come scriptlet endtag e xml header sono sulla stessa riga. Questo è ciò che il codice jsp incorporato deve sempre tenere in considerazione, whitechar leader innocente può rovinare risposte ben formattate.

<%@ 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>