fgetcsv() ignore les caractères spéciaux lorsqu'ils sont au début de la ligne!
J'ai un script simple qui accepte un fichier CSV et lit chaque ligne dans un tableau. J'ai ensuite parcourir chaque colonne de la première ligne (dans mon cas, il détient les questions d'une enquête) et j'ai l'impression. L'enquête est en français et chaque fois que le premier caractère d'une question est un caractère spécial (é,ê,ç, etc) fgetcsv simplement omet.
De caractères spéciaux dans le milieu de la valeur ne sont pas affectés uniquement lorsqu'ils sont le premier caractère.
J'ai essayé de déboguer cela, mais je suis perplexe. J'ai fait un var_dump avec le contenu du fichier et les personnages sont bel et bien là:
var_dump(utf8_encode(file_get_contents($_FILES['csv_file']['tmp_name'])));
Et voici mon code:
if(file_exists($_FILES['csv_file']['tmp_name']) && $csv = fopen($_FILES['csv_file']['tmp_name'], "r"))
{
$csv_arr = array();
//Populate an array with all the cells of the CSV file
while(!feof($csv))
{
$csv_arr[] = fgetcsv($csv);
}
//Close the file, no longer needed
fclose($csv);
//This should cycle through the cells of the first row (questions)
foreach($csv_arr[0] as $question)
{
echo utf8_encode($question) . "<br />";
}
}
fgetcsv() n'est binaire-sûr, si vous utilisez ASCII - en d'autres termes, pas du tout. Voir stackoverflow.com/questions/3637770/... - fondamentalement, il faut utiliser fgets() pour lire les données, puis analyser CSV à l'aide d'une fonction personnalisée. Apparemment, cela fonctionne aussi: stackoverflow.com/questions/1472886/...
OriginalL'auteur Gazillion | 2010-02-10
Vous devez vous connecter pour publier un commentaire.
Avez-vous déjà vérifié les page de manuel sur fgetcsv? Il n'y a rien à parler de ce problème spécifique désinvolte, mais un certain nombre de contributions peut-être intéressant de regarder si rien ne vient jusqu'ici.
Il y a ceci, par exemple:
Aussi, vu comme c'est toujours au début de la ligne, pourrait-il être que c'est vraiment une ligne cachée pause problème? Il y a ceci:
Vous pouvez également essayer d'enregistrer le fichier avec des fins de ligne.
OriginalL'auteur Pekka 웃
Vous êtes le réglage de vos paramètres régionaux correctement avant d'appeler
fgetcsv()
?Sinon,
fgetcsv()
n'est pas multi-octets en sécurité.Assurez-vous que vous mettez à quelque chose qui apparaît dans votre liste de jeux de paramètres régionaux disponibles. Sur linux (certainement sur debian) vous pouvez voir cela en faisant
Vous devriez obtenir quelque chose comme...
Pour le support UTF8 choisir un encodage en utf8 sur la fin. Si votre entrée est codé avec quelque chose d'autre, vous aurez besoin d'utiliser la locale - mais assurez-vous que votre système d'exploitation prend en charge en premier.
Si vous définissez les paramètres régionaux pour une locale qui n'est pas disponible sur votre système, il ne vous aidera pas.
Multi-Octets Safe = capable de gérer des codages dans laquelle un seul caractère peut être constitué de plus d'un octet (par exemple UTF-8).
Ah merci! Je crois que je vais le laisser là 🙂
Cela résout le problème pour moi aussi longtemps que l'entrée est UTF-8, mais le problème persiste pour les autres 8 bits encodages.
Grande réponse - quels sont les inconvénients de la définition des paramètres régionaux à un encodage UTF-8 sur l'ensemble du projet au lieu de juste pour
fgetcsv()
?OriginalL'auteur Brock Batsell
Ce comportement a un rapport de bug déposée, mais apparemment, il n'est pas un bug.
OriginalL'auteur David Johnstone
Nous avons vu le même résultat avec
LANG
ensemble deC
, et travaillé autour d'elle en veillant à ce que ces valeurs étaient enveloppés dans des guillemets. Par exemple, la lignegénère le tableau ci-après lorsqu'il est passé à travers
fgetcsv()
:Bien sûr, vous devrez échapper les guillemets de la valeur par les doubler, mais c'est beaucoup moins de tracas que de réparer les caractères manquants.
Curieusement, ce qui se passe avec les deux UTF-8 et cp1252 l'encodage du fichier d'entrée.
OriginalL'auteur eswald