Luego de buscar en varios repositorios y páginas de internet al final nos hemos encontrado la solución que te compartimos ahora.
Solución:
iconv -f WINDOWS-1252 -t UTF-8 filename.txt
¿Cómo esperaría que recode sepa que un archivo es Windows-1252? En teoría, creo ninguna es un archivo válido de Windows-1252, ya que asigna todos los bytes posibles a un carácter.
Ahora bien, hay ciertamente características que fuertemente sugerir que es UTF-8, si comienza con el BOM UTF-8, por ejemplo, pero no serían definitivos.
Una opción sería detectar primero si en realidad es un archivo UTF-8 completamente válido, supongo… de nuevo, eso solo sería una sugerencia.
No estoy familiarizado con la herramienta de recodificación en sí, pero es posible que desee ver si es capaz de recodificar un archivo desde y hacia el mismo codificación: si hace esto con un archivo no válido (es decir, uno que contiene secuencias de bytes UTF-8 no válidas), es posible que convierta las secuencias no válidas en signos de interrogación o algo similar. En ese momento, podría detectar que un archivo es UTF-8 válido al recodificarlo en UTF-8 y ver si la entrada y la salida son idénticas.
Alternativamente, haga esto mediante programación en lugar de usar la utilidad de recodificación; sería bastante sencillo en C#, por ejemplo.
Sin embargo, solo para reiterar: todo esto es heurístico. Si realmente no conoce la codificación de un archivo, nada se lo dirá con un 100% de precisión.
Aquí hay una transcripción de otra respuesta que di a una pregunta similar:
Si aplica utf8_encode () a un UTF8 ya string devolverá una salida UTF8 distorsionada.
Hice una función que aborda todos estos problemas. Se llama Codificación::toUTF8().
No necesita saber cuál es la codificación de sus cadenas. Puede ser Latin1 (iso 8859-1), Windows-1252 o UTF8, o el string puede tener una mezcla de ellos. Encoding::toUTF8() convertirá todo a UTF8.
Lo hice porque un servicio me estaba dando un feed de datos todo desordenado, mezclando UTF8 y Latin1 en el mismo string.
Uso:
$utf8_string = Encoding::toUTF8($utf8_or_latin1_or_mixed_string);
$latin1_string = Encoding::toLatin1($utf8_or_latin1_or_mixed_string);
Descargar:
https://github.com/neitanod/forceutf8
Actualizar:
He incluido otra función, Codificación::fixUFT8(), que arreglará cada UTF8 string eso parece distorsionado.
Uso:
$utf8_string = Encoding::fixUTF8($garbled_utf8_string);
Ejemplos:
echo Encoding::fixUTF8("Fédération Camerounaise de Football");
echo Encoding::fixUTF8("Fédération Camerounaise de Football");
echo Encoding::fixUTF8("FÃÂédÃÂération Camerounaise de Football");
echo Encoding::fixUTF8("Fédération Camerounaise de Football");
dará salida:
Fédération Camerounaise de Football
Fédération Camerounaise de Football
Fédération Camerounaise de Football
Fédération Camerounaise de Football
Actualización: he transformado la función (forceUTF8) en una familia de static funciones en una clase llamada Codificación. La nueva función es Encoding::toUTF8().
Si entiendes que te ha sido de provecho este post, agradeceríamos que lo compartas con el resto programadores así nos ayudas a dar difusión a este contenido.