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++Builder Discussion :

Enregistrer du texte sous une forme particulière


Sujet :

C++Builder

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Août 2002
    Messages
    481
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 481
    Par défaut Enregistrer du texte sous une forme particulière
    Bonjour,
    voilà ce que je cherche.
    Je travaille avec C++ Builder XE 6;
    J'ai écrit un programme me permettant de mettre sous une forme "lisible" le calendrier de Google (Googel Calendar).
    A la fin du programme j'enregistre le texte, qui est dans une TStringList.
    J'utilise Fichier->SaveToFile(NomDuFichie.txt).

    J'ai constaté que tous les caractères accentués étaient codé avec 4 octets, par exemple ê est enregistré C3AA.
    Les autres caractères sont enregistrés avec 2 octets.
    Le caractère ê pourrait également être enregistré avec 2 octets : EA.

    Que faudrait-il faire lors de l'enregistrement SaveToFile pour obtenir ce résultat ?

    Merci de votre aide.

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Par "C3AA" du veux dire littéralement 'C', '3', 'A', 'A' (quatre octets, 0x43234141) ou 0xC3AA (deux octets) ?

    0xC3AA est l'encodage UTF-8 de U+00EA, le code du 'ê' dans Unicode.
    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
    Membre éclairé
    Profil pro
    Inscrit en
    Août 2002
    Messages
    481
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 481
    Par défaut
    Il s'agit bien de 4 octets.
    J'ai essayé l'option
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SaveToFile(usNom, Encoding->ANSI);
    Cela n'a pas suffit.

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Août 2002
    Messages
    481
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 481
    Par défaut
    J'ai trouvé une solution, peut-être pas très élégante, mais elle me suffit.
    Pour ceux que cela pourrait intéresser :
    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
     
    UnicodeString ReparerLibelle(UnicodeString usLigne)
    {
    	const UnicodeString usC3 = "Ã";
    	int longueur, i;
    	if(usLigne.Pos(usC3) < 1) return usLigne;
    	longueur = usLigne.Length();
    	i = 1;
    	while(i <= longueur)
    	{
    		UnicodeString usCar = UnicodeString(usLigne[i]);
    		if(usCar == usC3)
    		{
    			usLigne.Delete(i, 1); longueur--;
    			UnicodeString usCaractere = usLigne.SubString(i, 1);
    			wchar_t* wcar = usCaractere.w_str();
    			*wcar = *wcar + 64;
    			usLigne[i] = *wcar;
    		}
    		i++;
    	}
    	return usLigne;
    }
    //---------------------------------------------------------------------------
    C'est basé sur le fait que les caractères codés sur 4 octets commencent tours par le même caractère codé sur 2 octets,
    le caractère suivant est transformé dans le caractère qui aurait du être codé sur 2 octets.
    Le premier des 2 caractères est à (C3) le suivant est de la forme AX ou BX, par exemple C3 A9 pour le caractère é. Son codage sur 2 octets est E9.
    E9 - A9 = 64.

  5. #5
    Membre Expert
    Avatar de Crayon
    Inscrit en
    Avril 2005
    Messages
    1 811
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 811
    Par défaut
    Citation Envoyé par Pasqualini Voir le message
    Il s'agit bien de 4 octets.
    J'ai essayé l'option
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SaveToFile(usNom, Encoding->ANSI);
    Cela n'a pas suffit.
    Je ne comprends pourquoi ici mon encodgae semble fonctionner.

    Le code que j'ai mis dans le constructeur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
        TStringList* Fichier = new TStringList();
        if(Fichier->Encoding == NULL)
        {
            Fichier->Add("Default Encoding: " + Fichier->DefaultEncoding->EncodingName);
        }
        else
        {
            Fichier->Add("Encoding: " + Fichier->Encoding->EncodingName);
        }
        Fichier->Add("Fête");
        Fichier->SaveToFile("c:\\temp.txt", TEncoding::ANSI);
        delete Fichier;
    Le résultat obtenu avec TEncoding::ANSI:
    00000000h: 44 65 66 61 75 6C 74 20 45 6E 63 6F 64 69 6E 67 ; Default Encoding
    00000010h: 3A 20 31 32 35 32 20 20 28 41 4E 53 49 20 2D 20 ; : 1252  (ANSI -
    00000020h: 6C 61 74 69 6E 20 49 29 0D 0A 46 EA 74 65 0D 0A ; latin I)..Fête..
    Lorsque j'utilise TEncoding::Unicode:
    00000000h: FF FE 44 00 65 00 66 00 61 00 75 00 6C 00 74 00 ; ÿþD.e.f.a.u.l.t.
    00000010h: 20 00 45 00 6E 00 63 00 6F 00 64 00 69 00 6E 00 ;  .E.n.c.o.d.i.n.
    00000020h: 67 00 3A 00 20 00 31 00 32 00 35 00 32 00 20 00 ; g.:. .1.2.5.2. .
    00000030h: 20 00 28 00 41 00 4E 00 53 00 49 00 20 00 2D 00 ;  .(.A.N.S.I. .-.
    00000040h: 20 00 6C 00 61 00 74 00 69 00 6E 00 20 00 49 00 ;  .l.a.t.i.n. .I.
    00000050h: 29 00 0D 00 0A 00 46 00 EA 00 74 00 65 00 0D 00 ; ).....F.ê.t.e...
    00000060h: 0A 00                                           ; ..
    Seulement quand je met TEncoding::UTF8 alors j'ai la même chose que toi:
    00000000h: EF BB BF 44 65 66 61 75 6C 74 20 45 6E 63 6F 64 ; Default Encod
    00000010h: 69 6E 67 3A 20 31 32 35 32 20 20 28 41 4E 53 49 ; ing: 1252  (ANSI
    00000020h: 20 2D 20 6C 61 74 69 6E 20 49 29 0D 0A 46 C3 AA ;  - latin I)..Fê
    00000030h: 74 65 0D 0A                                     ; te..

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Ça, c'est sur deux octets, comme c'est censé l'être.
    Pasqualini se plaint que chez lui il obtient quatre octets à la place, comme si l'encodage était converti en hexadécimal lors de l'enregistrement:
    Citation Envoyé par Médinoc Voir le message
    Par "C3AA" du veux dire littéralement 'C', '3', 'A', 'A' (quatre octets, 0x43234141) ou 0xC3AA (deux octets) ?
    Citation Envoyé par Pasqualini Voir le message
    Il s'agit bien de 4 octets.
    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 éclairé
    Profil pro
    Inscrit en
    Août 2002
    Messages
    481
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 481
    Par défaut
    Lorsque j'écris moi-même du texte, par exemple "fête de noël" et que je l'enregistre
    L’enregistrement se fait pour chaque caractère sur 2 octets.
    Le problème venait du fait que le fichier qui était enregistré était un fichier créé par Google,
    le fichier basic.ics, le fichier renfermant tous les enregistrements du Google Calendar.

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

Discussions similaires

  1. Enregistrer une classe sous une form
    Par adrienfehr dans le forum Visual Studio
    Réponses: 13
    Dernier message: 03/11/2010, 14h58
  2. Réponses: 2
    Dernier message: 10/09/2007, 19h03
  3. Texte sous une forme particulière
    Par mmb04 dans le forum Mise en forme
    Réponses: 2
    Dernier message: 12/06/2007, 15h10
  4. Emplacement d'un texte sous une image
    Par ghyosmik dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 26/12/2005, 11h53
  5. [DOM] Créer un fichier XML sous une forme bien précise
    Par LaseLiep dans le forum Format d'échange (XML, JSON...)
    Réponses: 8
    Dernier message: 09/06/2005, 18h05

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