2009-04-02 12 views
46

Estoy construyendo un servicio web y tengo un nodo que acepta una POST para crear un nuevo recurso. El recurso espera uno de dos tipos de contenido: un formato XML que definiré o variables codificadas por formulario.Detectando la codificación de caracteres de una solicitud HTTP POST

La idea es que las aplicaciones que consumen pueden PUBLICAR XML directamente y beneficiarse de una mejor validación, etc., pero también hay una interfaz HTML que PUBLICARÁ el material codificado en el formulario. Obviamente, el formato XML tiene una declaración de juego de caracteres, pero no puedo ver cómo detecto el conjunto de caracteres del formulario simplemente al mirar el POST.

Un puesto típica de la forma de Firefox tiene el siguiente aspecto:

POST /path HTTP/1.1 
Host: www.myhostname.com 
User-Agent: Mozilla/5.0 [...etc...] 
Accept: text/html,application/xhtml+xml, [...etc...] 
Accept-Language: en-gb,en;q=0.5 
Accept-Encoding: gzip,deflate 
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7 
Keep-Alive: 300 
Connection: keep-alive 
Content-Type: application/x-www-form-urlencoded 
Content-Length: 41 

field1=value1&field2=value2&field3=value3 

que no parece contener ninguna indicación útil del conjunto de caracteres.

Según lo que puedo ver, el tipo aplicación/x-www-form-urlencoded está completamente definido en HTML, que solo establece las reglas de codificación%, pero no dice nada sobre qué conjunto de caracteres deberían ser los datos en.

Básicamente, ¿hay alguna forma de decirle al juego de caracteres si no conozco el conjunto de caracteres que el HTML presentado originalmente tenía? De lo contrario, tendré que tratar de adivinar el juego de caracteres en función de qué caracteres están presentes, y eso siempre es un poco dudoso por lo que puedo decir.

+1

Hay muchas sutilezas aquí y el comportamiento, variará en función del navegador y operativo sistema. Una convención utilizada por IE es que si tiene una ENTRADA oculta con el nombre '_charset_', IE rellenará ese campo con el conjunto de caracteres que utilizó al enviar el formulario. Ver también la pregunta relacionada http://stackoverflow.com/questions/12830546/accept-charset-utf-8-parameter-doesnt-do-anything-when-used-in-form – EricLaw

Respuesta

57

la codificación predeterminada de HTTP POST es ISO-8859-1.

más tiene que mirar en la cabecera Content-Type que entonces contendrá

Content-Type: application/x-www-form-urlencoded ; charset=UTF-8 

puede declarar tal vez su forma con

<form enctype="application/x-www-form-urlencoded;charset=UTF-8"> 

o

<form accept-charset="UTF-8"> 

a forzar la codificación

Algunas referencias:

http://www.htmlhelp.com/reference/html40/forms/form.html

http://www.w3schools.com/tags/tag_form.asp

+1

¿Funciona esto con navegadores comunes? –

+0

Bueno, no sé, no soy un desarrollador web, he agregado enlaces donde puedes encontrar algunas referencias. – chburd

+0

Probé la codificación de formulario predeterminada en Safari y Firefox hace unos años, y descubrí que siempre devolvían UTF-8. No probé en IE. Debo añadir que la página con el formulario estaba en UTF-8. –

11

El juego de caracteres utilizado en la POST coincidirá con el juego de caracteres especificado en el código HTML que aloja el formulario. Por lo tanto, si su formulario se envía utilizando la codificación UTF-8 que es la codificación utilizada para el contenido publicado. La codificación URL se aplica después de que los valores se convierten al conjunto de octetos para la codificación de caracteres.

+1

Me preguntaba más si había una forma sin estado de abordarlo, como sin conocimiento del conjunto de caracteres de la forma. –

+0

No. El cliente tendría que declarar explícitamente el juego de caracteres en los encabezados HTTP para que funcione. –

+2

@CiaranMcNulty que en realidad no es cierto, algunos navegadores no lo hacen. Intenté esto en FF, forzando el juego de caracteres de la página a iso-8859-1, y todavía envió el formulario en UTF-8 –

1

Intente configurar el juego de caracteres en el Content-Type:

httpCon.setRequestProperty("Content-Type", "multipart/form-data; charset=UTF-8; boundary=" + boundary); 
+0

¿Qué es el límite? –

Cuestiones relacionadas