8721 sujets

Développement web côté serveur, CMS

Bonjour à tous
Je dois produire un fichier .csv destiné à être lu par Excel ou un autre tableur.
Les données contiennent des textes codés en utf-8
La question : comment faire en sorte que Excel comprenne que le fichier est en utf-8 ?
En recherchant sur internet, j'ai trouvé la méthode suivante
$fp = fopen($myFile, 'w');
fputs($fp, $bom =( chr(0xEF) . chr(0xBB) . chr(0xBF) ));
fputcsv($fp, $otherdata);
...

Mais Excel ne reconnait pas la BOM il affiche
Nom

dans la première cellule.

Si j'ouvre le fichier avec OpenOffice il me demande quel est le codage du fichier et l'ouvre correctement, mais il ne reconnait pas non plus la BOM.

Je pourrais bien entendu utiliser utf8_decode mais je préférerais ne pas en arriver là.

Une idée ?
Modérateur
Bonjour,

1) C'est quelle version d'Excel sur quel OS ?
2) Si on ne fait rien de spécial, ça marche avec OpenOffice et Numbers sur MacOS (ils détectent UTF-8 automatiquement). Code possible testé avec php 8 :
file_put_contents($fileName,$contentInUtf8);

3) L'utilisateur d'Excel peut préciser manuellement l'encodage éventuellement lorsqu'il ouvre un fichier csv semble-t-il ! À un moment lors de l'ouverture, dans le champ "origine du fichier", il faut sélectionner "65001: Unicode (UTF-8)". Mais la procédure exacte dépend de la version d'Excel.
4) Y a encore des gens qui utilisent Excel ? Smiley lol

EDIT: l'utilisation du BOM est de toute façon déconseillée.

Amicalement,
Modifié par parsimonhi (04 Nov 2022 - 11:59)
Merci de ta réponse
La demande que j'essaie de satisfaire c'est "mettre les résultats en format tableur".
C'est quoi un "format tableur" ?
Pour moi ça veut dire "lisible par un quelconque tableur", ce qui inclut les versions d'Excel présente sur le marché.
Après recherche, je n'ai pas trouvé de "format tableur" général que CSV, c'est poupr cela que j'essaie d'utiliser ce format. S'il y a un autre format qui vous parait adapté dites le moi.
Sur mon PC j'ai 2 versions d'Excel : la "vieille" version (avant 2007) a ma préférence, car l'ergonomie de l'autre version est aberrante, mais je suppose que la plupart des gens utilisent l'autre version. Je vais essayer avec cette autre version
Après test, ça ne marche pas mieux avec ma version récente
Impossible de trouver le numéro de version. Ce doit être le seul produit où on ne peut pas afficher le numéro de version dans l'aide.
Contrairement à OpenOffice il n'y a pas de dialogue pour demander quel est le codage du fichier.

Par ailleurs j'ai essayé d'utiliser utf8_decode, ça ne sait pas convertir les œ
Je n'imaginais pas ce matin en commençant que j'allais rencontrer ce type de problème.
C'est très mauvais pour ma tension artérielle !
Modérateur
Bonjour,

Il n'y a pas que 2 versions d'Excel, il y en a plein !

Si ça doit être lisible par un tableur quelconque, il est préférable me semble-t-il de ne rien faire de spécial à l'enregistrement du csv (on se contente de file_put_contents() en php avec des données qui sont en UTF-8 par exemple), et de demander aux utilisateurs qui ont des outils en retard d'une guerre de suivre la procédure appropriée (quand il y en a une) pour ouvrir un csv en uft8.

Vérifier que le fichier csv s'ouvre correctement avec Nodepad++ peut être un test utile quand on est sous windows pour savoir si ce fichier csv a une chance d'être lu avec d'autres logiciels.

Eventuellement tu peux aussi essayer de sauvegarder le fichier avec nodepad++ et ré-essayer de l'ouvrir avec ton Excel. Si ça marche c'est que tu avances.

Tu peux aussi tenter d'exporter des données dans un fichier csv en utilisant ton Excel puis regarder byte par byte ce qu'il y a dedans avec un code magique que tu ne devrais pas avoir de problème à mettre au point.

Pour une procédure a priori couramment utiliser par les utilisateurs d'Excel, voir par exemple http://www.idweb.fr/pages/ouvrir-un-fichier-csv-encode-en-utf8-sur-excel/

Si cette procédure (ou une procédure équivalente) n'est pas disponible dans l'Excel de l'utilisateur, il faudra sans doute qu'il change d'Excel ou de tableur.

Ajouter manuellement un BOM peut être source de confusion pour certains outils qui vont lire le fichier concerné. C'est pourquoi (selon moi) il est préférable de ne pas en mettre.

Amicalement,
C'est faisable dans Excel par Données>À partir d'un fichier texte/CSV
Faut le savoir!
Modifié par PapyJP (04 Nov 2022 - 12:48)
Bonsoir,
Je rentre surement un peu tard dans cette conversation.
Pour générer un fichier csv depuis un script PHP j'utilise ce code :
$file = fopen($fichier, "w");
fwrite($file, mb_convert_encoding($texte, 'ISO-8859-1', 'UTF-8'));

$fichier est le chemin et le nom du fichier csv
$texte contient les lignes du fichier csv. La séparation des lignes dans $texte est un "\n"
Meilleure solution
Modérateur
Bonjour,

Le code proposé par phiper ne fonctionne que si tous les caractères de $texte sont encodables en 'ISO-8859-1'.

Si $texte contient par exemple des hiéroglyphes (on ne sait jamais Smiley lol ), ça ne marchera pas !

Amicalement,
Modérateur
Bonjour,

Dans la page https://support.microsoft.com/fr-fr/office/nouveaut%C3%A9s-d-excel-2019-pour-windows-5a201203-1155-4055-82a5-82bf0994631f si on clique sur "Améliorations générales", on peut y lire :

Prise en charge CSV (UTF-8)

Vous pouvez désormais ouvrir et enregistrer des fichiers CSV qui utilisent le codage de caractères UTF-8. Accédez à Fichier > Enregistrer sous > Parcourir. Cliquez ensuite sur le menu Enregistrer sous. La nouvelle option CSV UTF-8 (délimité par des virgules) apparaît. La nouvelle option CSV UTF-8 (délimité par des virgules) apparaît. CSV UTF-8 est un format de fichier couramment utilisé qui prend en charge plus de caractères que l’option CSV existante (ANSI) d’Excel. Vous bénéficiez ainsi d’une meilleure prise en charge en termes d’utilisation des données dans des langues autres que l’anglais, et pouvez déplacer des données plus facilement vers d’autres applications.

En d'autres termes, il semble qu'il faille au moins Excel 2019 pour espérer ouvrir un csv en utf-8 "automatiquement" (mais il faudrait tester si c'est bien ça).

Amicalement,
Modifié par parsimonhi (04 Nov 2022 - 19:04)
Intéressant de voir Microsoft se ranger tardivement aux standards du marché. Ils doivent toujours se croire à l’époque où c’était eux qui déterminaient le standard!
J’ai réglé mon problème avec la méthode proposée par phiper avec le code Windows-1252 qui est ce qu’ils avaient défini pour les caractères latin1
A propos des hiéroglyphes, c’est pour mon autre site, mais on n’utilise pas le codage UTF8 des hiéroglyphes car les polices disponibles sont trop limitées. Le propriétaire du site fait des images avec un outil ad-hoc. J’ai du css approprié pour reconnaître ces images et les rendre responsives en relation avec la taille des caractères du texte qui les entourent. Sauf s’il ne met pas l’image dans le bon répertoire ou ne leur donne pas un nom approprié…