No se pueden convertir datos a Latin 1 en Linux usando PHP

Estoy tratando de recorrer un conjunto de archivos javascript, detectar su codificación y luego guardarlos en formato latin1 y utf8. Hasta ahora, realmente me he quedado atascado al intentar que PHP convierta un archivo UTF-8 a Latin1. He probado varios métodos diferentes para codificar los datos después de buscar, pero nada parece funcionar.

Esto es lo que estoy haciendo:

//Read file 
$fileIn = fopen($dirName . $fileNameIn, 'r');
$dataIn = fread($fileIn, filesize($dirName . $fileNameIn));
fclose($fileIn);

$encoding = mb_detect_encoding($dataIn);
echo "Encoding in: " . $encoding . "\r\n";

$dataOut = utf8_decode($dataIn);

echo "Encoding after: " . mb_detect_encoding($dataOut) . "\r\n";

Ambas impresiones imprimen UTF-8 como la codificación detectada. ¿Algunas ideas?

¿Podría esto tener algo que ver con el hecho de que el sistema predeterminado en mi caja de ubuntu es UTF-8?

preguntado el 08 de noviembre de 11 a las 15:11

2 Respuestas

Es posible que desee echar un vistazo a la función iconv (http://www.php.net/manual/en/book.iconv.php):

string iconv ( string $in_charset , string $out_charset , string $str )

Por lo tanto, intente escribir

 $dataOut = iconv($encoding, "ISO-8859-1", $dataIn);

y vea si eso soluciona el problema. Además, intente usar el modo estricto en mb_detect_encoding:

mb_detect_encoding($dataOut, mb_detect_order(), true);

respondido 08 nov., 11:19

Esta conversión parece funcionar en el sentido de que la detección ahora informa que la codificación ha cambiado. Sin embargo, cuando se escribe en el disco, PHP aún crea un archivo UTF-8. - Kristofer

Es posible que me haya perdido la conversión de algunos datos porque esto está funcionando ahora (aunque la detección no es tan confiable) - Kristofer

mb_detect_encoding podría ser un nombre inapropiado, ya que técnicamente no es posible detectar codificaciones. Si no conoce la codificación, solo puede adivinar (consulte Resúmenes de codificaciones compatibles).

Hablando tan técnicamente, una cadena puede tener múltiples codificaciones pero mb_detect_encoding solo devolverá un valor. Y como está escrito, técnicamente no es posible detectar una codificación.

Mientras busca un soluciones codificación, puede hacer uso de los parámetros adicionales:

echo "Encoding after: " . mb_detect_encoding($dataOut, 'ISO-8859-1', TRUE) . "\r\n";

Tal vez esto ayude, verifica ISO-8859-1 solo y lo hace estricto.

respondido 08 nov., 11:19

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.