2011-07-05 16 views
7

Me encontré con un pequeño problema al analizar CSV-Strings que contienen diéresis (-> ä, ö, ü, Ö, Ü) en PHP.PHP str_getcsv elimina diéresis

Supongamos la siguiente cadena de entrada csv:

w;x;y;z 
48;OSL;Oslo Stock Exchange;B 
49;OTB;Österreichische Termin- und Optionenbörse;C 
50;VIE;Wiener Börse;D 

Y el código PHP adecuada que se utiliza para analizar la cadena y crear una matriz que contiene los datos de la csv-String:

public static function parseCSV($csvString) { 
    $rows = str_getcsv($csvString, "\n"); 
    // Remove headers .. 
    $header = array_shift($rows); 
    $cols = str_getcsv($header, ';'); 
    if(!$cols || count($cols)!=4) { 
     return null; 
    } 
    // Parse rows .. 
    $data = array(); 
    foreach($rows as $row) { 
     $cols = str_getcsv($row, ';'); 
     $data[] = array('w'=>$cols[0], 'x'=>$cols[1], 'y'=>$cols[2], 'z'=>$cols[3]); 
    } 
    if(count($data)>0) { 
     return $data; 
    } 
    return null; 
} 

El resultado de llamar a la función anterior con los resultados de la serie csv dados en:

Array 
(
    [0] => Array 
     (
      [w] => 48 
      [x] => OSL 
      [y] => Oslo Stock Exchange 
      [z] => B 
     ) 

    [1] => Array 
     (
      [w] => 49 
      [x] => OTB 
      [y] => sterreichische Termin- und Optionenbörse 
      [z] => C 
     ) 

    [2] => Array 
     (
      [w] => 50 
      [x] => VIE 
      [y] => Wiener Börse 
      [z] => D 
     ) 
) 

Tenga en cuenta que a la segunda entrada le falta Ö. Esto solo ocurre si la diéresis se coloca directamente después del carácter de separador de columna. También sucede, si más de una diéresis se coloca en secuencia, es decir "ÖÖÖsterreich" -> "sterreich". La cadena csv se envía utilizando un formulario HTML, por lo tanto, el contenido recibe codificación URL. Utilizo un servidor Linux, con codificación utf-8 y la cadena csv parece correcta antes de analizar.

¿Alguna idea?

+1

no puede reproducirse. funciona para mi. http://codepad.viper-7.com/v6WIaT – Gordon

+0

Es un problema de codificación. Traté de colocar la cadena directamente en el archivo php, usando la codificación UTF-8. Entonces funcionó. Ahora uso $ csvString = utf8_encode ($ csvString); antes del código de análisis, y funciona como un amuleto. – Javaguru

+1

Supongo que debería asegurarme de que todos los datos de formulario estén codificados con UTF-8, utilizando la etiqueta meta y un encabezado de respuesta HTTP apropiado. – Javaguru

Respuesta

6

fgetcsv Suponiendo (http://php.net/manual/en/function.fgetcsv.php) funciona de forma similar a str_getcsv() y luego citar la página del manual:

configuración regional se tiene en cuenta por esta función. Si LANG es, por ejemplo, es_US.UTF-8, los archivos de la codificación de un byte se leen erróneamente con esta función .

entonces usted debe tratar de establecer un local con setlocale http://php.net/manual/en/function.setlocale.php

si esto no funciona, pruebe a activar múltiples bytes de sobrecarga http://www.php.net/manual/en/mbstring.overload.php

o mejor aún, el uso de una biblioteca estándar como un marco Biblioteca Zend/Symfony para extraer los datos

0

Tuve un problema similar con el carácter ï en algunos datos que se originaron en Microsoft Excel, guardado como un CSV (sí, con Codificación UTF8 seleccionada en la sección "opciones web" del cuadro de diálogo "Guardar como ..."). Y aún así, esta no parece ser la misma codificación UTF8 que str_getcsv espera.

ahora funciono todo a través de iconv primera y funciona bien - no parece algo con la idea de Excel de un archivo CSV:

iconv -f windows-1252 -t utf8 source.csv > output.csv 
Cuestiones relacionadas