La conversión es fácil. La detección es la parte difícil. Puedes probar mb_detect_encoding pero es un método muy inestable, literalmente "adivina" el tipo de contenido y como @troelskn resalta en los comentarios, puede adivinar las diferencias "duras" en el mejor de los casos (¿Es una codificación de varios bytes?) Pero falla al detectar matices de juegos de caracteres similares.
La forma correcta sería la OMI:
- interpretar cualquier
content-type
meta-tags en la página
- interpretar cualquier
content-type
cabeceras enviadas por el servidor
- Si eso produce nada, tratan de "oler" el codificación usando mb_detect_encoding()
- Si eso no produce nada, vuelva a un valor predeterminado definido (tal vez ISO-8859-1, tal vez UTF-8).
Diferente que se indica en las directrices de @ respuesta de Gumbo, yo personalmente creo que los meta-tags deberían tener prioridad sobre las cabeceras de servidor porque estoy bastante seguro de que si una etiqueta meta está presente, es un indicador más fiable de la la codificación real de la página que la configuración de un servidor, algunos operadores de sitios ni siquiera saben cómo cambiar. La forma correcta, sin embargo, parece ser tratar los encabezados de tipo de contenido con mayor prioridad.
Para el primero, creo que puede usar get_meta_tags(). Lo último que deberías obtener de curl ya, solo tendrías que analizarlo. Here es un ejemplo completo sobre cómo procesar sistemáticamente los encabezados de respuesta servidos por cURL.
La conversión entonces estaría utilizando iconv:
$new_content = iconv("incoming-charset", "utf-8", $content);
¡Ooohh dulce! Voy a probarlo cuando encuentre el tiempo. –
Gracias por compartir, ¡me salvaste la vida! : D –
Bien hecho, pero en caso de que hagamos un procesamiento adicional en sentido descendente, queremos reparar las etiquetas y sobre la marcha. Me tomé la libertad de actualizar su código con eso en mente. – DomQ