Detectando la encoding de caracteres en HTML

Descargo una página HTML. El encabezado de tipo de contenido HTTP especifica una encoding de caracteres, y la página tiene una meta que especifica otra. ¿Cuál es la forma correcta de manejar eso?

Supongo que “correcto” no es la palabra correcta, ya que nadie sigue los malditos estándares de todos modos … ¿cuál es el camino que me causará menos problemas?

Haga lo mismo que hacen los navegadores web: use el encabezado de respuesta. Cuando HTML se publica a través de HTTP, la metaetiqueta se ignora cuando el encabezado de respuesta está presente. Solo cuando se lee el HTML del sistema de archivos del disco local, se utiliza la metaetiqueta. Esto también está explícitamente especificado por w3 HTML spec .

En resumen, los agentes de usuario conformes deben observar las siguientes prioridades al determinar la encoding de caracteres de un documento (desde la prioridad más alta hasta la más baja):

  1. Un parámetro HTTP “charset” en un campo “Content-Type”.
  2. Una statement META con “http-equiv” establecido en “Content-Type” y un valor establecido para “charset”.
  3. El atributo charset establecido en un elemento que designa un recurso externo.

Cualquier analizador de HTML existente decente en cualquier idioma que use debería tener esto en cuenta. Según el historial de preguntas que conoces sobre Java, te sugiero que agarres Jsoup por esto.