Usando PHP 5.3 fgetcsv función, estoy experimentando algunos problemas debido a la codificación de la materia. Tenga en cuenta que este archivo español «especial» caracteres latinos como gráfico acentos á, é, í ï, etc…

Me sale el archivo CSV de exportación de algunos estructurado de datos que tengo en una MS de 2008 para Mac archivo de Excel.

Si la abro con Mac OS X TextEdit aplicación, todo parece ir perfecto.

Pero cuando me pongo a mi programa de PHP e intentar leer el archivo CSV usando que fgetcsv función de PHP, no estoy recibiendo para que se lea correctamente el juego de caracteres.

/**
 * @Route("/cvsLoad", name="_csv_load")
 * @Template()
 */
public function cvsLoadAction(){
    //setlocale(LC_ALL, 'es_ES.UTF-8');
    $reader = new Reader($this->get('kernel')->getRootDir().'/../web/uploads/documents/question_images/2/41/masiva.csv');

    $i = 1;
    $r = array("hhh" => $reader -> getAll());

    return new Response(json_encode($r, 200));
}

Como se puede ver, he intentado usar también una setlocale a es_ES.UTF-8. Pero nada que funcione.

La lectura viene aquí:

public function getRow()
{
    if (($row = fgetcsv($this->_handle, 10000, $this->_delimiter)) !== false) {
        $this->_line++;
        return $this->_headers ? array_combine($this->_headers, $row) : $row;
    } else {
        return false;
    }
}

Ver lo que me sale en $fila de la variable después de cada fila de la lectura:

php fgetcsv - juego de caracteres de codificación problemas

Los ? personajes que se supone son las vocales con acentos gráficos en ellos.

Ninguna idea de por allí? Funciona si utiliza microsoft Excel para Windows? ¿Cómo puedo saber en tiempo de ejecución exacta de la codificación del archivo y la puso delante de la lectura?

(Para los hablantes de español, no asustarse con tan horrible de materia médica en los textos ;)).

  • Mismo problema. Una codificado en UTF8 archivo CSV de las importaciones de la multa en un servidor, pero no en el otro. Terminé de escribir mi propio CSV lector.
  • FWIW, realmente no se puede saber la codificación de un archivo sin ser dicho. Usted puede adivinar cuando la lees, y convertir en consecuencia, pero nada es tan confiable como dice la codificación.
  • Gracias cbuckley. ¿A qué te refieres con «convertir en consecuencia»una especie de tratar de adivinar y preguntar al usuario si se aprueba la importación? Y si no, seguiré probando otras codificaciones para el origen?
InformationsquelleAutor ElPiter | 2012-11-08

2 Comentarios

  1. 32

    Intente esto:

    function convert( $str ) {
        return iconv( "Windows-1252", "UTF-8", $str );
    }
    
    public function getRow()
    {
        if (($row = fgetcsv($this->_handle, 10000, $this->_delimiter)) !== false) {
            $row = array_map( "convert", $row );
            $this->_line++;
            return $this->_headers ? array_combine($this->_headers, $row) : $row;
        } else {
            return false;
        }
    }
    • +1. Nota sobre la docs: si el archivo es de un solo byte codificado (como CP1252), pero el local es multibyte, entonces fgetcsv no funciona como se esperaba.
    • Este fue el mejor!! 🙂 Muchas gracias. Sólo algunos comentarios: en primer lugar, es necesario declarar como estática de la función de convertir y mapa en array_map como ‘auto:convertir’; en segundo lugar, en mi caso fue iconv(«macintosh», «UTF-8», $str), como MS Excel para Mac OS exporta a CSV usando Mac OS Romano. Por último, aunque esto es una gran respuesta y realmente me ayudó, todavía no es todo lo resuelve mis necesidades, como no voy a saber si mi usuarios cargar un archivo desde un Mac o un PC, o lo que sea… cualquier otras pistas sobre cómo detectar que es la codificación de los archivos subidos? Gracias de nuevo!!
    • Usted necesidad de utilizar la heurística .. primero ver si es válido UTF-8 o UTF-16, si no, determinar PC/MAC (De un agente de usuario de cabecera) y el uso de Windows-1252 para PC y Macintosh para mac. Por supuesto, si el usuario no está utilizando el alfabeto latino, que haría uso de Windows-1251 (Cirílico para Windows) y así sucesivamente. Alguien debe de haber escrito una biblioteca para esto 😀
    • Si usted puede esperar que sus usuarios a usar chrome o firefox con javascript activado, puede acceder al contenido del archivo en javascript. Entonces, podría representar un menú desplegable con diferentes codificaciones y permitir que el usuario escoja la que muestra los caracteres correctamente, y enviar esa información junto con el archivo al cargar
    • Esto funcionó para mí. Pero sospecho que hay una manera mejor (para definir la codificación antes de fopen() se llama). Así que no voy a votar.
    • Impresionante. Yo estaba rascándome la cabeza desde ayer.

  2. 0

    Es probable que ver con la forma en que excel codifica el archivo al guardar.

    Intenta subir el .xls archivo a google docs y descarga como .csv

    • Yo también lo intentó, pero va incluso peor que yo pienso. Sin embargo, voy a tratar de nuevo. Gracias por la rápida respuesta. 🙂

Dejar respuesta

Please enter your comment!
Please enter your name here