acentos php csv utf-8 fgetcsv

php - fgetcsv acentos



Problemas UTF-8 mientras lee el archivo CSV con fgetcsv (6)

Intento leer un CSV y repetir el contenido. Pero el contenido muestra los caracteres incorrectos.

Mäx Müstermänn -> Mäx Mästermänn

La codificación del archivo CSV es UTF-8 sin BOM (verificada con Notepad ++).

Este es el contenido del archivo CSV:

"Mäx";"Müstermänn"

Mi script PHP

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> </head> <body> <?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, ";")) { $num = count ($data); for ($c=0; $c < $num; $c++) { // output data echo "<td>$data[$c]</td>"; } echo "</tr><tr>"; } ?> </body> </html>

Intenté usar setlocale(LC_ALL, ''de_DE.utf8''); como se sugiere here sin éxito. El contenido sigue siendo incorrecto.

¿Qué me estoy perdiendo?

Editar:

Un echo mb_detect_encoding($data[$c],''UTF-8''); me da UTF-8 UTF-8.

echo file_get_contents("specialchars.csv"); me da "Mäx";"Müstermänn" .

Y

print_r(str_getcsv(reset(explode("/n", file_get_contents("specialchars.csv"))), '';''))

me da

Array ( [0] => Mäx [1] => Müstermänn )

Qué significa eso?


Ahora lo tengo funcionando (después de eliminar el comando de header ). Creo que el problema fue que la codificación del archivo php estaba en ISO-8859-1. Lo configuré en UTF-8 sin BOM. Pensé que ya lo había hecho, pero quizás hice un deshacer adicional.

Además, utilicé SET NAMES ''utf8'' para la base de datos. Ahora también es correcto en la base de datos.


El problema es que la función devuelve UTF-8 (puede verificar usando mb_detect_encoding), pero no convierte , y estos caracteres toman como UTF-8. Por lo tanto, es necesario hacer la conversión inversa a la codificación inicial (Windows-1251 o CP1251) usando iconv . Pero dado que el fgetcsv devuelve una matriz, sugiero que escriba una función personalizada: [ Lo siento por mi inglés ]

function customfgetcsv(&$handle, $length, $separator = '';''){ if (($buffer = fgets($handle, $length)) !== false) { return explode($separator, iconv("CP1251", "UTF-8", $buffer)); } return false; }


En mi caso, el archivo fuente tiene la codificación windows-1250 e iconv imprime toneladas de avisos sobre caracteres ilegales en la cadena de entrada ...

Entonces esta solución me ayudó mucho:

/** * getting CSV array with UTF-8 encoding * * @param resource &$handle * @param integer $length * @param string $separator * * @return array|false */ private function fgetcsvUTF8(&$handle, $length, $separator = '';'') { if (($buffer = fgets($handle, $length)) !== false) { $buffer = $this->autoUTF($buffer); return str_getcsv($buffer, $separator); } return false; } /** * automatic convertion windows-1250 and iso-8859-2 info utf-8 string * * @param string $s * * @return string */ private function autoUTF($s) { // detect UTF-8 if (preg_match(''#[/x80-/x{1FF}/x{2000}-/x{3FFF}]#u'', $s)) return $s; // detect WINDOWS-1250 if (preg_match(''#[/x7F-/x9F/xBC]#'', $s)) return iconv(''WINDOWS-1250'', ''UTF-8'', $s); // assume ISO-8859-2 return iconv(''ISO-8859-2'', ''UTF-8'', $s); }

Respuesta a la respuesta de @manvel - use str_getcsv en lugar de explotar - debido a casos como este:

some;nice;value;"and;here;comes;combinated;value";and;some;others

explotar explotará cadena en partes:

some nice value "and here comes combinated value" and some others

pero str_getcsv explotará la cadena en partes:

some nice value and;here;comes;combinated;value and some others


Prueba esto:

<?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>"; } ?>


Se encontró un problema similar: analizar el archivo CSV con caracteres especiales como é, è, ö, etc.

Lo siguiente funcionó bien para mí:

Para representar los caracteres correctamente en la página html, se necesitaba el encabezado:

header(''Content-Type: text/html; charset=UTF-8'');

Para analizar correctamente todos los caracteres, utilicé:

utf8_encode(fgets($file));

No te olvides de utilizar en todas las siguientes operaciones de cadena las ''Funciones de cadenas de varios bytes'', como:

mb_strtolower($value, ''UTF-8'');


Trate de poner esto en la parte superior de su archivo (antes de cualquier otro resultado):

<?php header(''Content-Type: text/html; charset=UTF-8''); ?>