IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

Lecture d'un fichier Unicode


Sujet :

C

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Novembre 2007
    Messages : 8
    Points : 7
    Points
    7
    Par défaut Lecture d'un fichier Unicode
    Bonjour,

    J'ai un souci de lecture à partir d'un fichier codé en UNICODE. Je suis sous MS Visual C++ 6.0. Projet : Win32 Console Application.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    int TraitementFichierCSVFromDAT(char* szCheminFichierCSV, char* szNomFichierCSV, Vecteur_Ligne_CSV_From_DAT & VecteurDonneesCSVFromDAT) {
     
     
    char szChaineLue[100];
    FILE* FichierCSV;
     
    //Ouvrir le fichier CSV
    	sprintf(szCheminCompletCSV, "%s\\%s", szCheminFichierCSV, szNomFichierCSV);
    	FichierCSV = fopen(szCheminCompletCSV, "r");
     
    	if (FichierCSV != NULL) {
    		while (!feof(FichierCSV)) {
    			//Lire une ligne du fichier
    			fgets(szChaineLue, 100, FichierCSV );
     
    ...
    Lorsque la ligne lue dans le fichier est : toto
    j'obtiens dans szChaineLue : 0 116 0 111 0 116 0 111 0 0
    au lieu de : 116 111 116 111 0

    Ma chaîne est donc inexploitable, il me faudrait la convertir.

    J'ai essayé :
    -de bidouiller avec _T() et _TEXT()
    http://www.cplusplus.com/forum/windows/1081/
    le compilateur ne reconnait pas ces fonctions, j'ai pourtant inclus tchar.h

    -de déclarer szChaineLue en wchar_t et d'utiliser fgetws au lieu de fgets, le résultat est strictement le même Pourtant, quand j'écris :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    wchar_t szChaineLue2[100];
    wcscpy(szChaineLue2, L"toto");
    wprintf(L"%s\n", szChaineLue2);
    szChaineLue2 contient bien 116 111 116 111 0 et "toto" s'affiche dans la console

    -de regarder dans les settings du projet car j'ai lu sur internet qu'il y'avait une option pour l'unicode mais je ne l'ai pas trouvée (option absente dans VC++ 6.0 ? )

    -d'utiliser les fonctions décrites ici : MultiByteToWideChar et WideCharToMultiByte mais je bloque un peu sur leur utilisation.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    wchar_t szChaineLue2[100];
    char szChaineLue4[100];
    fgetws(szChaineLue2, LONGEUR_CHAINE, FichierCSV );
     
    int m = WideCharToMultiByte (CP_UTF8, WC_COMPOSITECHECK, szChaineLue2, 100, szChaineLue4, 100, NULL, NULL);
    szChaineLue4 n'est jamais modifiée. Que faire?

    Est-ce bien là la solution à tous mes problèmes d'Unicode? Comment faire?

    J'ai passé toute la journée d'hier à patauger, j'ai vraiment besoin d'aide.
    Merci d'avance.

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Tu ne peux pas lire un fichier UCS-2 ou UTF-16 avec les fonctions standard de lecture texte (même avec la version "large" de ces fonctions!).

    Sous Visual Studio 2005, il y a des extensions Microsoft permettant de le faire. Mais elles ne sont pas présentes dans Visual C++ 6...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Novembre 2007
    Messages : 8
    Points : 7
    Points
    7
    Par défaut
    Ha? Ha bon, merci, je pouvais chercher longtemps

    Quelles sont ces extensions sous VS 2005 dont tu parles?

  4. #4
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Sous 2005, on peut rajouter des options dans le second paramètre de fopen().
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Novembre 2007
    Messages : 8
    Points : 7
    Points
    7
    Par défaut
    OK. Je suis en train de télécharger Visual C++ 2008 Express Edition pour tester tout ça.

    Une question cependant : à quoi servent les fonctions larges fgetws et compagnie s'il n'est pas possible de lire un fichier Unicode?

  6. #6
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    En fait, ça n'est pas que c'est absolument impossible, mais ça dépend du système.

    Si tu as un Linux configuré en UTF-8, il est probable fgetwc() te convertisse correctement N caractères en un caractère large... (mais je n'ai pas testé).
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  7. #7
    Membre émérite Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Points : 2 280
    Points
    2 280
    Par défaut
    Citation Envoyé par The_Beast Voir le message
    Une question cependant : à quoi servent les fonctions larges fgetws et compagnie s'il n'est pas possible de lire un fichier Unicode?
    Dans l'appel à la fonction fgets(), le premier paramètre est une chaine de caractère, dans l'appel à la fonction fgetws(), le premier paramètre est une chaine de caractère large. Pour ceux qui code avec des wchar_t, ça évite de faire les conversions. Autrement ça ne change en rien le comportement de la fonction.
    "The quieter you become, the more you are able to hear"
    "Plus vous êtes silencieux, plus vous êtes capable d'entendre"

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Novembre 2007
    Messages : 8
    Points : 7
    Points
    7
    Par défaut
    J'ai réussi à lire un fichier encodé en Unicode avec VC++ 2008 Express Edition.

    J'ai passé 2 jours pour me creuser la cervelle et m'arracher les cheveux et chez moi, j'ai passé à peine 1h à me faire un programme de test vite fait et j'ai réussi à tester les différents modes de lecture.

    Si ça peut aider certains :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    #include <stdio.h>
    #include <string.h>
     
     
    int main () {
    	int iRetour = 0;		//Retour de la fonction
    	FILE* pFichier;			//Fichier à parcourir
    	char szCheminFichier[100];	//Chemin complet vers le fichier à ouvrirz
    	errno_t err;			//Retour des appels de fonctions de manipulation des fichiers
    	wchar_t szChaineLue[100];	//Chaîne lue dans le fichier
    	wchar_t* pcRetour;			//Sert à tester le retour de fgets
     
     
    	//Déterminer le chemin complet vers le fichier à traiter
    	err = strcpy_s(szCheminFichier, 100, "E:\\Unicode.csv");
    	//Utilisation de strcpy_s : fonction plus sécurisée que strcpy
    	if (err != 0) {
    		//Un problème est survenu lors de la copie de chaîne
    		iRetour = 1;
    	}
     
    	if (iRetour == 0) {
    		//Ouvrir le fichier
    		err = fopen_s(&pFichier, szCheminFichier, "r, ccs=UNICODE");
    		//Utilisation de fopen_s : fonction plus sécurisée que fopen
    		if (err != 0) {
    			//Un problème est survenu lors de l'ouverture du fichier
    			iRetour = 2;
    		}
    	}
     
    	if (iRetour == 0) {
    		//Lire dans le fichier
    		pcRetour = fgetws(szChaineLue, 100, pFichier);
    		if (pcRetour == NULL) {
    			//Un problème est survenu lors de la lecture dans le fichier
    			iRetour = 3;
    		}
    	}
     
    	if (iRetour == 0) {
    		printf("Chaine lue : %ls\n", szChaineLue);
    	}
     
    	return iRetour;
    }

    Merci pour votre aide.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Lecture d'un fichier codé unicode en utf8
    Par spe31500 dans le forum Langage
    Réponses: 7
    Dernier message: 09/02/2015, 13h59
  2. [ksh] Lecture d'un fichier unicode ligne par ligne
    Par Arnaud F. dans le forum Shell et commandes GNU
    Réponses: 6
    Dernier message: 30/07/2008, 20h46
  3. Lecture de fichiers Unicode en Perl
    Par papet dans le forum Langage
    Réponses: 1
    Dernier message: 24/07/2006, 10h53
  4. [langage] Optimiser la lecture d'un fichier
    Par And_the_problem_is dans le forum Langage
    Réponses: 4
    Dernier message: 05/02/2003, 08h54
  5. [langage] Optimiser la lecture d'un fichier
    Par And_the_problem_is dans le forum Langage
    Réponses: 2
    Dernier message: 11/06/2002, 10h24

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo