¿El formulario HTML seguro acepta el juego de caracteres?

Me enfrenté a un problema de encoding de parámetros al enviar un formulario con el método get (no puedo usar el método de publicación). Algunos caracteres acentuados no se escaparon en la URL, ya que mi página era UTF8. El controlador Spring recuperó caracteres malos en su lugar.

Resolví este problema estableciendo accept-charset="ISO-8859-1" en mi formulario, pero ahora, me pregunto qué juego de caracteres es seguro para todas las combinaciones de servidor / navegador. ¿Hay alguna recomendada para mis formularios y URL de “obtención”?

Esto es frustrante (por decirlo suavemente) con servlets. La encoding URL estándar debe usar UTF-8, aunque los servlets no solo tienen el valor predeterminado de ISO-8859-1, sino que tampoco ofrecen ninguna forma de cambiarlo con el código.

Claro que puedes req.setRequestEncoding("UTF-8") antes de leer cualquier cosa, pero por alguna razón impía esto solo afecta el cuerpo de la solicitud, no consulta los parámetros de la cadena. No hay nada en la interfaz de solicitud de servlet para especificar la encoding utilizada para los parámetros de cadena de consulta.

Usar ISO-8859-1 en tu forma es un truco. Usar esta encoding antigua causará más problemas que resolverlos con seguridad. Especialmente porque los navegadores no son compatibles con ISO-8859-1 y siempre lo tratan como Windows-1252. Mientras que los servlets tratan a ISO-8859-1 como ISO-8859-1, por lo que serás atormentado más allá de toda creencia si sigues con esto.

Para cambiar esto en Tomcat, por ejemplo, puede usar el atributo URIEncoding en su elemento :

  

Si no utiliza un contenedor que tenga esta configuración, no puede cambiar su configuración o algún otro problema, aún puede hacerlo funcionar porque la deencoding ISO-8859-1 conserva la información completa del binario original.

 String correct = new String(request.getParameter("test").getBytes("ISO-8859-1"), "UTF-8") 

Entonces digamos test=ä y si todo está correctamente configurado, el navegador lo codifica como test=%C3%A4 . Su servlet lo decodificará incorrectamente como ISO-8859-1 y le dará la cadena resultante "ä" . Si aplica la corrección, puede obtener ä vuelta:

 System.out.println(new String("ä".getBytes("ISO-8859-1"), "UTF-8").equals("ä")); //true 

Nickdos tiene razón. Otra forma de hacerlo es usar la etiqueta de metadatos:

  

También tenga en cuenta al manejar la respuesta en el servidor, el código también debe usar la encoding correcta (misma).

Ejemplo:

utilice stringParamer.getBytes("utf-8") instead of stringParamer.getBytes()

Y al usar Spring, asegúrese de que la encoding correcta esté configurada para los convertidores de mensajes en el archivo de configuración del DispatcherServlet (XYZ_-servlet.xml), por ejemplo: