Mysql
 sql >> Base de données >  >> RDS >> Mysql

Caractères non anglais dans la base de données utilisant Java

Vous devriez vraiment essayer de tout faire en UTF-8 d'un point à un autre.

Utilisez un classement compatible Unicode approprié pour la base de données et la table, je donne toujours par table même si db default a déjà été donné. Cette réponse a beaucoup de problèmes mysql + java et aussi de servlet, mais ils devraient répondre à la plupart des problèmes que nous devons connaître lors du développement d'applications java compatibles 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;

Utilisez la chaîne de connexion jdbc pour avoir une traduction 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"
/>

Forcez Tomcat à utiliser le jeu de caractères de type de contenu pour les chaînes de paramètres GET et POST, appliquez donc l'attribut useBodyEncodingForURI pour les connecteurs http et https (fichier 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"
/>

Au début de chaque page de servlet, assurez-vous que les parseurs Tomcat demandent des paramètres en utf-8. Vous devez appeler setCharacterEncoding avant de lire les paramètres ou il est trop tard. La plupart des navigateurs Web n'envoient pas d'attribut charset de type de contenu, de sorte que les moteurs de servlet peuvent le deviner incorrect.

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

Soyez prudent avec la page .jsp, n'insérez pas de caractères blancs vides ou il peut être trop tard pour appeler setCharacterEncoding, voyez comment je mets des marqueurs de balise à la fin de chaque ligne pour éviter tout caractère blanc, ainsi que la façon dont les éléments html commencent à partir de la première ligne. Balise Jsp contentType va à la réponse http et pageEncoding signifie comment le fichier est stocké sur un disque. Si vous avez uniquement l'éditeur de texte ISO-8859-15 et que vous ne codez pas en dur les lettres i18n dans une page jsp, vous pouvez choisir le codage de page iso* approprié.

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

Création d'un document xml dans la page jsp, vous devez écrire un en-tête xml sans caractères blancs ni sauts de ligne. Voyez comment la balise de fin de scriptlet et l'en-tête xml sont dans une même ligne. C'est ce que le code jsp intégré doit toujours prendre en considération, un caractère blanc innocent en tête peut ruiner des réponses bien formatées.

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