Estoy trabajando en una aplicación Java. Necesito obtener la codificación UTF-8 en mi aplicación web Java para admitir texto en bengalí (বাংলা). He hecho lo siguiente:
Servidor de Tomcat.xml
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" URIEncoding="UTF-8" /> <Connector executor="tomcatThreadPool" port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" URIEncoding="UTF-8" /> <Connector protocol="AJP/1.3" address="::1" port="8009" redirectPort="8443" URIEncoding="UTF-8" />JVM defaultCharset en el archivo catalina.bat
set JAVA_OPTS=%JAVA_OPTS% -Dfile.encoding=UTF-8propiedades en application.properties
spring.datasource.url=jdbc:mysql://localhost:3306/database_name?useUnicode=true\&characterEncoding=UTF-8 spring.datasource.tomcat.connection-properties=useUnicode=true;characterEncoding=UTF-8 spring.http.encoding.charset=UTF-8 spring.http.encoding.enabled=true spring.http.encoding.force=true server.tomcat.uri-encoding=UTF-8 spring.webflux.multipart.headers-charset=UTF-8 spring.thymeleaf.encoding=UTF-8metaetiqueta en archivo html
<!doctype html> <html lang="en" xmlns:th="http://www.thymeleaf.org" xmlns:sec="http://www.thymeleaf.org/extras/spring-security"> <head> <meta charset="utf-8"> </head> <body> </body> </html>compatibilidad con utf-8 en la etiqueta de formulario
<form enctype="multipart/form-data" accept-charset="UTF-8" action="#" th:action="@{/create}" th:object="${object}" th:method="POST"> <div class="form-group"> <label for="name" class="col-form-label">Name</label> <input type="text" class="form-control" id="name" name="name" th:field="*{name}" placeholder="Enter Name"> </div> <div class="form-group"> <label for="photo">Photo</label> <input type="file" class="form-control-file" id="photo" name="photo"/> </div> <div> <button class="btn" type="submit">Submit</button> </div> </form>Configuración de MySQL (mi.ini)
[client] default-character-set = utf8mb4 [mysql] default-character-set = utf8mb4propiedades mysql:
Database: Default collation: utf8mb4_0900_ai_ci Default charactterset: utf8mb4 Table: Table collation: utf8mb4_0900_ai_ci Column: Type: varchar(255) Character Set: utf8mb4 Collation: utf8mb4_0900_ai_ciConfiguración:
Cuando envío un formulario con valor আনোয়ার , se guarda como আনোয়ার
¿Como puedó resolver esté problema?
Cuando ejecuto la aplicación desde eclipse, funciona bien. Pero cuando el archivo war se implementa en el servidor Tomcat, no funciona.
Probé el siguiente código. Imprime আনোয়ার en el archivo tomcat8-stdout. Así que creo que ocurre un problema al transferir datos del navegador al servidor, del servidor a la base de datos está bien.
@PostMapping("/create") public String create(@ModelAttribute("object") Object object, @RequestParam("photo") MultipartFile photo) throws IOException { System.out.println(object.getName()); return "redirect:/index"; }La codificación de los parámetros POST no se establece en el nivel del Connector , sino en el objeto ServletRequest .
Tomcat proporciona un filtro para configurarlo, como se explica en la documentación .
Agregue esto a su archivo web.xml:
<filter> <filter-name>setCharacterEncodingFilter</filter-name> <filter-class>org.apache.catalina.filters.SetCharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> </filter> <filter-mapping> <filter-name>setCharacterEncodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>¿Intentó configurar lo siguiente en server.xml para tomcat para permitir caracteres escapados en las URL?
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" relaxedPathChars="[]|" relaxedQueryChars="[]|{}^\`"<>" redirectPort="8443" />