Cómo especificar la codificación, mientras archivo de proceso csv en PHP?
Pregunta
<?php
$row = 1;
$handle = fopen ("test.csv","r");
while ($data = fgetcsv ($handle, 1000, ",")) {
$num = count ($data);
print "<p> $num fields in line $row: <br>\n";
$row++;
for ($c=0; $c < $num; $c++) {
print $data[$c] . "<br>\n";
}
}
fclose ($handle);
?>
Lo anterior viene del manual de php, pero no vi dónde especificar la codificación (como UTF-8 o así)
Solución
Trate de cambiar la configuración regional.
Como se dice más adelante el ejemplo en el manual de href="http://de3.php.net/manual/en/function.fgetcsv.php" rel="nofollow diste :
Nota: configuración regional se tiene en cuenta por esta función. Si LANG es, por ejemplo en_US.UTF-8, archivos en un byte de codificación se leen mal por esta función.
enfoque por el comentario en la misma página sugerida:
setlocale(LC_ALL, 'ja_JP.UTF8'); // for japanese locale
nombres Área local se pueden encontrar en RFC 1766 y ISO 639 . Diferentes sistemas tienen diferentes esquemas de nombramiento de los entornos. [...] En Windows, establece el
setlocale(LC_ALL, '')
nombres específicos de la configuración regional / idioma del sistema (accesibles a través del Panel de Control).
Otros consejos
Una tal cosa es la aparición de la marca de orden de bytes UTF, o lista de materiales. El carácter UTF-8 para la marca de orden de bytes es U + FEFF, o más bien tres bytes - 0xEF, 0xBB y 0xBF - que se encuentra en el inicio del archivo de texto. Para UTF-16 se utiliza para indicar el orden de bytes. Para UTF-8 no es realmente necesario.
Así que hay que detectar los tres bytes y quitar la lista de materiales. A continuación se muestra un ejemplo simplificado de cómo detectar y eliminar los tres bytes.
$str = file_get_contents('file.utf8.csv');
$bom = pack("CCC", 0xef, 0xbb, 0xbf);
if (0 == strncmp($str, $bom, 3)) {
echo "BOM detected - file is UTF-8\n";
$str = substr($str, 3);
}
Eso es todo
intente lo siguiente:
<?php
$handle = fopen ("specialchars.csv","r");
echo '<table border="1"><tr><td>First name</td><td>Last name</td></tr><tr>';
while ($data = fgetcsv ($handle, 1000, ";")) {
$data = array_map("utf8_encode", $data); //added
$num = count ($data);
for ($c=0; $c < $num; $c++) {
// output data
echo "<td>$data[$c]</td>";
}
echo "</tr><tr>";
}
?>