sql >> Base de Datos >  >> RDS >> Mysql

Caracteres no ingleses en la base de datos usando Java

Realmente debería intentar hacer todo UTF-8 de punto a punto.

Use la intercalación adecuada de Unicode para la base de datos y la tabla, siempre doy por tabla, incluso si ya se proporcionó el valor predeterminado de db. Esta respuesta tiene muchos problemas de mysql+java y también de servlet, pero deberían responder a la mayoría de los problemas que necesitamos saber al desarrollar aplicaciones Java compatibles 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;

Use la cadena de conexión jdbc para tener traducción 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"
/>

Obligue a Tomcat a usar el juego de caracteres de tipo de contenido para las cadenas de parámetros GET y POST, así que aplique el atributo useBodyEncodingForURI para los conectores http y https (archivo 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"
/>

Al comienzo de cada página de servlet, asegúrese de que los analizadores de Tomcat soliciten parámetros como utf-8. Debe llamar a setCharacterEncoding antes de leer los parámetros o será demasiado tarde. La mayoría de los navegadores web no envían atributos de juego de caracteres de tipo de contenido, por lo que los motores de servlet pueden adivinar mal.

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

Tenga cuidado con la página. Etiqueta jsp contentType va a la respuesta http y pageEncoding significa cómo se almacena el archivo en un disco. Si solo tiene el editor de texto ISO-8859-15 y no codifica las letras i18n en una página jsp, puede elegir la codificación de página iso* adecuada.

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

Al crear un documento xml en la página jsp, debe escribir el encabezado xml sin caracteres blancos ni saltos de línea. Vea cómo la etiqueta final del scriptlet y el encabezado xml están en la misma línea. Esto es lo que el código jsp incrustado siempre debe tener en cuenta, el whitechar inicial inocente puede arruinar las respuestas bien formateadas.

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