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 :

fopen texte avec accent


Sujet :

C++

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 7
    Points : 5
    Points
    5
    Par défaut fopen texte avec accent
    Bonjour,

    J'ai le code suivant ou je récupère du texte dans un fichier encodé en UTF-8 (sans BOM) sur un serveur linux que je transmet ensuite à un logiciel sous Windows avec le framework gSOAP par un fichier cgi.

    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
     
    int calcService::help(int lang_id, wchar_t **result)
    {
      	//setlocale(LC_CTYPE, "");
    	FILE *pFile;
    	char fileName[100];
            [...]
            pFile = std::fopen (fileName, "r, ccs=<UTF-8>");
    	if (pFile == NULL) perror ("Error opening file");
    	else
    	{
    	  	*result = new wchar_t[400];
    		int i=0;
    		wchar_t line[1000][400];
     
    		while(fgetws(line[i], 400, pFile))
    		{
    			printf("%s", line[i]);
    			++i;
    		}
     
    		std::fclose (pFile);
     
    		int line_size = sizeof(line);
    		srand(time(0));
    		int n = random()%i;
    		*result = line[n];
    		//*result = L"éàèç";
     
    	}
    	return SOAP_OK;
    }
    Le problème est que lorsqu'il y a des accents dans un des textes du fichier, rien ne s'affiche.
    J'ai essayé de lire en mode binaire, en ajoutant "ccs=<UTF-8>", rien ne marche. Si je met simplement "*result = L"éàèç";" ça marche sans problèmes.
    Le problème vient surement de l'ouverture du fichier texte ou de la lecture du contenu.
    Quelqu'un a une idée?

  2. #2
    Modérateur
    Avatar de bruno_pages
    Homme Profil pro
    ingénieur informaticien à la retraite
    Inscrit en
    Juin 2005
    Messages
    3 533
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : ingénieur informaticien à la retraite
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2005
    Messages : 3 533
    Points : 6 709
    Points
    6 709
    Par défaut
    Bonjour,

    oh lala, désolé mais ce code est une véritable catastrophe

    • qu'est-ce que c'est que ce "r, ccs=<UTF-8>" ? pour moi std::fopen n'accepte que r, w et a
    • sizeof(line) retourne quelque chose comme 1600000 (dépend du compilateur), donc line[n] à quasiment aucune chance de rendre une des lignes lue
    • de toute façon *result = line[n] ne recopie pas la chaine de caractères, result pointera au mieux quelque part dans le tableau ... qui disparaitra en sortie de fonction
    • si votre fichier fait plus de 1000 lignes vous aurez un bel écrasement mémoire en pile
    • toute ligne de plus de 400 caractères sera découpée en plusieurs lignes
    • il y a un mélange entre les char et wchar_t, par exemple printf n'est pas prévue pour les wchar_t, utilisez fputws
    • vous retournez SOAP_OK dans tout les cas, y compris lorsque le fichier n'a pas pu être ouvert, autant de rien rendre
    • passez la chaine résultât par référence plutôt que par pointeur, c.a.d. wchar_t *&result, cela sera plus naturel
    Bruno Pagès, auteur de Bouml (freeware), mes tutoriels sur DVP (vieux, non à jour )

    N'oubliez pas de consulter les FAQ UML et les cours et tutoriels UML

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 7
    Points : 5
    Points
    5
    Par défaut
    qu'est-ce que c'est que ce "r, ccs=<UTF-8>" ? pour moi std::fopen n'accepte que r, w et a
    http://msdn.microsoft.com/fr-fr/libr...8VS.80%29.aspx


    Ce code marche, donc à part critiquer le code (c'est sûr qu'il n'est pas parfait), vous n'apportez pas grand chose à mon problème...

  4. #4
    Modérateur
    Avatar de bruno_pages
    Homme Profil pro
    ingénieur informaticien à la retraite
    Inscrit en
    Juin 2005
    Messages
    3 533
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : ingénieur informaticien à la retraite
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2005
    Messages : 3 533
    Points : 6 709
    Points
    6 709
    Par défaut
    quel rapport avec std::fopen ?

    Ce code marche
    non, il ne marche pas, et c'est bien pour cela que vous demander de l'aide

    vous n'apportez pas grand chose à mon problème...
    si vous n'aimez pas les critiques il ne faut pas montrer votre code, si je passe du temps à analyser ce que vos fournissez ce n'est pas pour moi mais pour vous

    relisez mes remarques et vous verrez que j'ai donner plusieurs raisons majeures faisant que votre code ne peut pas marcher correctement

    c'est sûr qu'il n'est pas parfait
    ce n'est pas que votre code n'est pas parfait, c'est qu'il est vraiment catastrophique, et si je le (re)dis ce n'est ni par méchanceté ni pour vous embêter, mais bien pour que vous compreniez le niveau des problèmes
    Bruno Pagès, auteur de Bouml (freeware), mes tutoriels sur DVP (vieux, non à jour )

    N'oubliez pas de consulter les FAQ UML et les cours et tutoriels UML

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 7
    Points : 5
    Points
    5
    Par défaut
    Je suis d'accord avec vous.

    Sinon fputws c'est pour écrire dans un fichier. Sa me convient pas dans mon cas. Je lis les lignes présentes dans le fichier pour après en transmettre une aléatoirement.

    Le code comme présenté (compilé sous linux avec gcc sans erreurs) marche pour un texte sans accents mais pas avec un texte avec accents.

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 7
    Points : 5
    Points
    5
    Par défaut
    J'ai réglé le problème moi-même.

    En mettant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    setlocale(LC_CTYPE, "en_US");
    et en modifiant

    par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    wprintf(L"%ls", line[i]);
    ça marche!

  7. #7
    Modérateur
    Avatar de bruno_pages
    Homme Profil pro
    ingénieur informaticien à la retraite
    Inscrit en
    Juin 2005
    Messages
    3 533
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : ingénieur informaticien à la retraite
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2005
    Messages : 3 533
    Points : 6 709
    Points
    6 709
    Par défaut
    Citation Envoyé par zhora Voir le message
    fputws c'est pour écrire dans un fichier
    un FILE * n'est pas forcément associé à un fichier

    printf("%s", line[ i]); est un raccourci pour fprintf(stdout, "%s", line[i ]);, ne même pour wprint ou puts etc

    par contre je viens de voir que ce que j'ai dis à propos de line[n] dans *result = line[n] est en partie faux car j'avais lu cela comme *result = line[line_size]. line_size ne sert en fait à rien, mais en sortie result pointe bien sur quelque chose qui existait en pile et qui n'existe plus, l'affectation d'une variable de type pointeur (ici wchar_t *) ne recopie pas la chose pointée. Et les remarques suivantes restent vraies.
    Bruno Pagès, auteur de Bouml (freeware), mes tutoriels sur DVP (vieux, non à jour )

    N'oubliez pas de consulter les FAQ UML et les cours et tutoriels UML

  8. #8
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 361
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 361
    Points : 20 381
    Points
    20 381
    Par défaut
    Citation Envoyé par zhora Voir le message
    Bonjour,

    J'ai le code suivant ou je récupère du texte dans un fichier encodé en UTF-8 (sans BOM) sur un serveur linux que je transmet ensuite à un logiciel sous Windows avec le framework gSOAP par un fichier cgi.
    Salut si tu est sous Windows tu seras obligé d'utiliser des API comme
    WideCharToMultiByte et vice versa MultiByteToWideChar selon un code prédéfini.
    Ces API permettent de convertir des wchar en char et vice-versa
    Oui fopen ne s'utilise qu'avec des char ANSI

Discussions similaires

  1. Afficher du texte avec accents et une image
    Par totof49 dans le forum ActionScript 1 & ActionScript 2
    Réponses: 1
    Dernier message: 15/01/2009, 13h53
  2. Meta Descriptif texte avec accents
    Par Jopzeut dans le forum Référencement
    Réponses: 1
    Dernier message: 01/08/2008, 08h08
  3. [Oracle] Texte avec accent et quote
    Par akrogames dans le forum PHP & Base de données
    Réponses: 13
    Dernier message: 30/04/2008, 11h47
  4. [Regex] Vérifier un texte avec accents
    Par supermanu dans le forum Collection et Stream
    Réponses: 2
    Dernier message: 09/10/2005, 15h29
  5. [SYBASE] Texte avec accents
    Par vsavoir dans le forum Sybase
    Réponses: 6
    Dernier message: 14/02/2005, 16h50

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