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

Windows Discussion :

Problème Unicode en C


Sujet :

Windows

  1. #61
    Membre actif Avatar de Twindruff
    Inscrit en
    Janvier 2005
    Messages
    216
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 216
    Points : 237
    Points
    237
    Par défaut
    J'ai pas lu entièrement ton code mais il faut que tu fasses attention, la console que t'as sous windows (cmd.exe) elle n'affiche que de l'ASCII.
    Tu peux rediriger la sortie du programme vers un fichier pour vérifier:
    Et ensuite lire le fichier sortie avec un editeur de texte qui sait lire l'utf8.

  2. #62
    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
    _tcscmp(), c'est pour comparer des chaînes de TCHAR. Pour comparer des chaînes de wchar_t, utilise wcscmp().

    Hélas, il n'y a rien dans la bibliothèque C standard, ni dans celle de GCC, qui permette d'écrire réellement en wchar_t dans un flux, à part l'écriture binaire.

    Par contre, Visual Studio 2005 et supérieurs possèdent une extension de fopen() permettant ça.
    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. #63
    Futur Membre du Club
    Inscrit en
    Août 2009
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 39
    Points : 6
    Points
    6
    Par défaut
    Salut les programmeurs,

    Très bon idée monsieur Twindruff, oui je vais bien utilise cette méthode de écrire résultat dans un fichier texte, mais le problème maintenant c'est dans le code, je peux pas comparai deux chaînes Unicode

    J'ai utilise monsieur Médinoc la fonction wcscmp() mais la même résultât, "Non"

    Lire Fichier Texte
    Si " ب " écrire "Oui"
    Sinon écrire "Non"


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    TCHAR LINE[1024];
     ...
    _wfopen() / _tfopen()
     ...
    LINE = Premier Ligne..
     ...
     if ( _tcscmp ( TEXT( "ب" ) , LINE ) == 0 )
      { wprintf ( _TEXT ( "Oui" )); }
     else
      { wprintf ( L "Non" ); }
    Toujours résultat est "Non."

    J'ai tester _wcscmp(), _tcscmp(), wchar_t, TCHAR, _wfopen(), _tfopen(), _TEXT(""), L"", compilation aucun erreur, mais toujours comparaison fini par "Non" même le fichier contiens "ب"

    --------------------------------------------------

    BUT RÉSUMER:
    Savoie si fichier texte (UTF8/UNICODE) contiens character "ب" ou non.

    PROBLÈME RÉSUMER:
    toujours comparaison fini par "Non" même le fichier contiens "ب"

  4. #64
    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
    Le problème, c'est que même les fonctions "w" de fichiers ne sont pas vraiment prévues pour lire des fichiers en Unicode.

    Tu peux t'en sortir sous Visual 2005 avec une extension, mais si tu veux que ça marche ailleurs, tu vas devoir faire de la lecture binaire...
    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. #65
    Futur Membre du Club
    Inscrit en
    Août 2009
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 39
    Points : 6
    Points
    6
    Par défaut
    Salut les programmeurs,

    Je peux pas utilise d'autre compilateur que GCC!
    Est ce que je peux vraiment lire des chars Unicode en mode binaire ? si non c'est possible avec C++ ?

  6. #66
    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
    Lire en binaire sur l'entrée standard, je ne sais pas.
    Mais lire en binaire sur un fichier, tout-à-fait: Il suffit que le fichier soit en UTF-16 LE, ce qui est l'encodage unicode "par défaut" sous Windows...
    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. #67
    Futur Membre du Club
    Inscrit en
    Août 2009
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 39
    Points : 6
    Points
    6
    Par défaut
    Salut les programmeurs,

    Oui tu es raison monsieur Médinoc, lecture en mode binaire permet de comparer deux string Unicode

    Crée fichier "test.bin" en mode binaire
    Crée dans fichier "ب"
    Lire fichier "test.bin" en mode binaire
    si fichier contiens "ب" afficher "Oui"
    si non afficher "Non"


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     wchar_t buffer_bin[20];
     wchar_t chracter[20]= L"ب";
    
     FILE *handleWriteBin=_wfopen(L"test.bin",L"wb");
     fwrite(chracter, 1, 13, handleWriteBin);
     fclose(handleWriteBin);
    
     FILE *handleReadBin=_wfopen(L"test.dat",L"rb");
     fread(buffer_bin,1,13,handleReadBin);
     fclose(handleReadBin);
     
     if( wcscmp ( L"ب" , buffer_bin ) == 0 )
          { wprintf(L"Oui.\n");  }
     else { wprintf(L"Non.\n",buffer); }
    Résultat: "Oui" Bravo monsieur Médinoc

    Alors pour utilise cette lecture en mode binaire dans mon projet j'ai fait cette méthode:

    Lire fichier "monfichier.txt" en mode UTF8
    Ecrire Text_UTF8 dans fihcier "test.bin" en mode binaire
    Lire fichier "test.bin" en mode binaire
    si fichier contiens "ب" afficher "Oui"
    si non afficher "Non"

    Ça veux dire Lecture en mode UTF8, Enregistrer le dans TEST.BIN en mode Binaire, Lecture TEST.BIN en mode binaire, comparer.



    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
    // Lire monfichier.txt en mode UTF8
    infile=_wfopen(L"monfichier.txt",L"r,ccs=UTF-8");
    
     line_number=0;
     while( fgetws(buffer_utf8,sizeof(buffer_utf8),infile)!=NULL)
     {
      ++line_number;
      // cherche fin du ligne 
      LINE_LEN=wcslen(buffer_utf8)-1;
      if(buffer_utf8[LINE_LEN]=='\n') { buffer_utf8[LINE_LEN]=0; }
      
      // Afficher ligne du fichier UTF8, c'est pas le but...
      wprintf(L"Read UTF8[%d]: '%s' - ",line_number,buffer_utf8);
      
     // Ecrire ligne dans test.bin en mode binair
     FILE *handleWrite=_wfopen(L"test.bin",L"wb");
     fwrite(buffer_utf8, 1, 13, handleWrite);
     fclose(handleWrite);
     
     // Lecture fichier test.bin en mode binaire pour comparer (marche très bien avec test d'ancien test.bin)
     FILE *handleReadBin=_wfopen(L"test.bin",L"rb");
     fread(buffer_bin,1,13,handleReadBin);
     wprintf(L"Read Bin: '%s' - \n",buffer_bin);
     fclose(handleReadBin);
     
     //Comparer
     if( wcscmp ( L"ب" , buffer_bin ) == 0 )
          { wprintf(L"Oui.\n");  }
     else { wprintf(L"Non.\n",buffer); }
     }
     fclose(infile);
    Résultat: "Non" .

    J'ai tester avec le ancien fichier test.bin (sortie du premier code) résultat "Oui", c'est a dire que écriture/lecture/comparer en mode binaire est bon, mais problème c'est encore la même... je peux pas lire string UTF8 est le mettre dans buffer

  8. #68
    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 Windows, on utilise UTF-16, pas UTF-8.

    UTF-8 ne marche qu'en de rares endroits, notamment dans les fonctions WideCharToMultiByte() et MultiByteToWideChar(), qui servent à convertir entre ASCII étendu et UTF-16.
    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.

  9. #69
    Futur Membre du Club
    Inscrit en
    Août 2009
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 39
    Points : 6
    Points
    6
    Par défaut
    Salut les programmeurs,

    J'ai tester UTF-16 LE BOM, UTF-16 BE BOM, UTF-16 LE, UTF-16 BE mais toujours résultat "Non"

    Si non, il y a aucun solution avec des librairies ? ou en C++ ?
    (Avec Compilateur GCC toujours)

  10. #70
    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
    Attends, tu utilises toujours fgetws() ? Quand je disais "lecture binaire", je parlais d'utiliser fread()...
    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.

  11. #71
    Futur Membre du Club
    Inscrit en
    Août 2009
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 39
    Points : 6
    Points
    6
    Par défaut
    Salut les programmeurs,

    Si j'ai la utilise, il est déjà écris dans tous mes dernier codes poster!

    J'ai fichier TEST.TXT (UTF-16).
    Je veux lire ce fichier est savoir si contiens "ب" ou non.

    J'ai li ce fichier en mode binaire comme vous me dit monsieur Médinoc

    Lecture
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    wchar_t buffer_bin[20];
    
    FILE *handleReadBin=_wfopen(L"TEST.TXT",L"rb");
       fread(buffer_bin,1,13,handleReadBin);
     fclose(handleReadBin);
    Comparer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     if( wcscmp ( L"ب" , buffer_bin ) == 0 ) { wprintf(L"Oui.\n");  }
     else { wprintf(L"Non.\n"); }
    Résultat:
    Non.

  12. #72
    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
    utilise sizeof(wchar_t) au lieu de 1.
    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.

  13. #73
    Futur Membre du Club
    Inscrit en
    Août 2009
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 39
    Points : 6
    Points
    6
    Par défaut
    Salut les programmeurs,

    J'ai tester sizeof(wchar_t) mais même résultat, je sais pas ou problème, peut être dans lecture ou dans comparaison !

    Voila fichier TXT.TXT
    http://saif-technology.com/test.txt

    Voila fichier code source
    http://saif-technology.com/program.c

  14. #74
    Futur Membre du Club
    Inscrit en
    Août 2009
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 39
    Points : 6
    Points
    6
    Par défaut
    Salut les programmeurs,

    J'ai fait deux nuit blanche pour trouver une solution de mon problème , (lire fichier Unicode ligne par ligne), j'ai rien trouver que une seul solution Stupide

    La Solution Stupide :

    1. Ouvrire un fichier avec fopen() "code.c" est écrire dedans:
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      ...
      int main(){
      wchar_t buffer[20];
      wchar_t temp[20]= L"
    2. Copier le contenu du fichier Unicode a notre fichier code.c par une commande MSDOS:
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      system("copy code.c+manfichier.txt /B");
    3. Ajouter du code au fichier code.c:
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      ";
      FILE *handleWrite=_wfopen(L"test.dat",L"wb");
      fwrite(temp, 1, 13, handleWrite);
      fclose(handleWrite);return 0;}


    Résultat dans fichier code.c:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    int main(){
    wchar_t buffer[20];
    wchar_t temp[20]= L" [ ICI LE CONTENU DU FICHIET manfichier.txt ] ";
    FILE *handleWrite=_wfopen(L"test.dat",L"wb");
    fwrite(temp, 1, 13, handleWrite);
    fclose(handleWrite);return 0;}
    En compile fichier code.c est il nous crée fichier test.dat en mode binair qui contien text du fichier Unicode !!! !!! ... Bon je sais que c'est Stupide, Long, mais c'est la seul solution a lire un fichier Unicode dans mon cas.

    Résumer du La Solution Stupide:
    Convertir fichier texte Unicode "manfichier.txt" a fichier binaire "test.dat".

    ===============================================

    Je pensez maintenant tous simplement a chercher une solution en C qui convertir un fichier texte Unicode a un fichier binaire sans lire le contenu du fichier texte Unicode !, c'est possible ?

  15. #75
    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
    Pour lire un fichier UTF-16 ligne par ligne, le mieux est de le lire en binaire avec fread() wchar_t par wchar_t jusqu'à ce que tu tombes sur un L'\n'...
    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.

  16. #76
    Futur Membre du Club
    Inscrit en
    Août 2009
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 39
    Points : 6
    Points
    6
    Par défaut
    Salut les programmeurs,

    J'ai fait mon possible pour le lire, j'ai bien chercher dans le net, mais j'arrive pas

    Sil vous plaît monsieur Médinoc vous pouvez me donner un petite exemple ?

+ Répondre à la discussion
Cette discussion est résolue.
Page 4 sur 4 PremièrePremière 1234

Discussions similaires

  1. Problème unicode / caractères spéciaux + écriture de fichier
    Par Mysti¢ dans le forum Général Python
    Réponses: 12
    Dernier message: 01/12/2010, 12h38
  2. Problème unicode avec _ungetwch() (conio)
    Par haypo dans le forum Windows
    Réponses: 1
    Dernier message: 05/04/2009, 14h24
  3. [D7] Problème UNICODE : TTntStringList
    Par Zepeq dans le forum Composants VCL
    Réponses: 0
    Dernier message: 06/03/2008, 16h19
  4. [MySQL] Problème unicode sortie BD (MySQL 5)
    Par bractar dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 19/05/2007, 08h34
  5. Problème unicode sortie BD
    Par bractar dans le forum SQL Procédural
    Réponses: 1
    Dernier message: 18/05/2007, 16h20

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