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 :

Convertir fichier UTF8 en ANSI


Sujet :

C++

  1. #1
    Membre averti Avatar de Trunks
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2004
    Messages
    534
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2004
    Messages : 534
    Points : 412
    Points
    412
    Par défaut Convertir fichier UTF8 en ANSI
    Bonjour,

    J'aimerais convertir un fichier codé en mode UTF8 en un fichier codé en ANSI (UTF16 d'après ce que j'ai lu).

    Comment faire?

    J'ai trouvé des propositions, mais elles ne marchent pas...

    Merci d'avance

  2. #2
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 367
    Points
    50 367
    Par défaut
    Attention, ANSI, c'est pas UTF-16

    Combien de fichier doit tu transformer. Parce que si tu n'en a qu'un seul, tu peux peut être utiliser les fonctions de "enregistrer sous ..." de Notepad ou Wordpad
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  3. #3
    Membre averti Avatar de Trunks
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2004
    Messages
    534
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2004
    Messages : 534
    Points : 412
    Points
    412
    Par défaut
    En fait, j'ai un programmé qui lit exécute une requête stocké dans un fichier à plat.

    Si le fichier est codé en ANSI, ça marche. Par contre, s'il est codé en Unicode, alors ça ne marche plus.

    Je voudrais que ça soit le programme qui gère le codage du fichier; ainsi, si on me passe un fichier UTF8 ou ANSI, le programme devrait fonctionner normallement.

    Sur le site, j'ai trouvé le codé suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    std::wofstream resfile("dest.sql");
    std::wifstream srcfile("src.sql");
     
    resfile.imbue(std::locale("UTF-8"));
    srcfile.imbue(std::locale("UTF-16"));
    Mais ça me génère une exception au niveau de imbue() ...

  4. #4
    Membre expérimenté
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 354
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 354
    Points : 1 419
    Points
    1 419
    Par défaut
    un programme qui s'appelle iconv !
    il te transforme un fichier d'un certain character set en un autre.
    ... tres tres utile.

    a+

  5. #5
    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
    UTF-16 est tout aussi Unicode que UTF-8, donc pas "ANSI" (d'ailleurs, ANSI est un abus de langage, mais bon tout le monde le fait, y compris MS).

    La conversion de UTF-8 à UTF-16 est, à ma connaissance, sans perte. Par contre, la conversion d'un encodage Unicode à une quelconque page de codes Ansi (je suppose que tu cherches à convertir en CP1252) provoquera des pertes, puisque la page de code en question ne comprend pas tous les caractères Unicode.
    Donc, tu dois aussi décider que faire des caractères "invalides": Les ignorer ? Les remplacer par un autre caractère, genre un point, un espace, ou un point d'interrogation?
    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.

  6. #6
    Membre averti Avatar de Trunks
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2004
    Messages
    534
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2004
    Messages : 534
    Points : 412
    Points
    412
    Par défaut
    Merci pour vos réponse.

    Voici ma problématique.

    Je veux récupérer le contenu d'un fichier dans une chaîne de caractères. Le fichier peut être encodé selon 3 encodages (ce n'est pas moi qui gère l'encodage du fichier):
    - ANSI
    - UTF-8
    - Unicode

    Si je ne me trompe pas, pour le codage ANSI, je dois utiliser une std::string, tandis que pour les encodages UTF-8 et Unicode (qui sont des caractères étendus), je dois utiliser une std::wstring.

    Voici un exemple simple pour illustrer la problématique:

    Exemple.cpp:

    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
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    #include <Windows.h>
    #include <string>
    #include <fstream>
    #include <sstream>
     
    void						test_ansi();
    void						test_utf8();
    void						test_unicode();
     
    int APIENTRY				WinMain(HINSTANCE hInstance,
    									HINSTANCE hPrevInstance,
    									LPSTR     lpCmdLine,
    									int       nCmdShow)
    {
    	test_ansi();
    	test_utf8();
    	test_unicode();
     
    	return 0;
    }
     
    void						test_ansi()
    {
    	std::string			str;
    	std::ifstream		ifs("input_ansi.txt");
    	std::ofstream		ofs("output_ansi.txt");
    	std::stringstream	ss;
     
    	ss << ifs.rdbuf();
    	ifs.close();
     
    	str = ss.str();
     
    	MessageBoxA(NULL, str.c_str(), "Message", MB_OK);
     
    	ofs << str;
    	ofs.close();
    }
     
    void						test_utf8()
    {
    	std::wstring			wstr;
    	std::wifstream			wifs("input_utf8.txt");
    	std::wofstream			wofs("output_utf8.txt");
    	std::wstringstream		wss;
     
    	wss << wifs.rdbuf();
    	wifs.close();
     
    	wstr = wss.str();
     
    	MessageBoxW(NULL, wstr.c_str(), L"Message", MB_OK);
     
    	wofs << wstr;
    	wofs.close();
    }
     
    void						test_unicode()
    {
    	std::wstring			wstr;
    	std::wifstream			wifs("input_unicode.txt");
    	std::wofstream			wofs("output_unicode.txt");
    	std::wstringstream		wss;
     
    	wss << wifs.rdbuf();
    	wifs.close();
     
    	wstr = wss.str();
     
    	MessageBoxW(NULL, wstr.c_str(), L"Message", MB_OK);
     
    	wofs << wstr;
    	wofs.close();
    }
    Ainsi que 3 fichiers test.

    input_ansi.txt (encodé en ANSI):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ANSI - Ligne 1
    ANSI - Ligne 2
    ANSI - Ligne 3

    input_utf8.txt (encodé en UTF-8):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    UTF-8 - Ligne 1
    UTF-8 - Ligne 2
    UTF-8 - Ligne 3

    input_unicode.txt (encodé en Unicode):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Unicode- Ligne 1
    Unicode- Ligne 2
    Unicode- Ligne 3
    Et voici le résultat du test:



    Ca marche bien pour un fichier encodé en ANSI.
    Pour un fichier encodé en UTF-8, j'ai un caractère bizarre qui s'insère en début de chaîne.
    Pour un fichier encodé en Unicode, ça m'affiche n'importe quoi.

    Comment y remédier?

    Je pensais peut être convertir les fichiers non encodés en ANSI en ANSI, mais dans ce cas il y aurait une éventuelle perte d'information comme l'a précisé Médinoc, et de plus je ne sais pas comment faire ...

    Merci d'avance

  7. #7
    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
    Un wstream ne suffit pas pour lire un fichier en UTF-16.

    Par contre, sous Visual 8 et supérieur, il y a une extension pour lire un fichier dans un encodage Unicode avec un simple FILE*.
    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.

  8. #8
    Membre averti Avatar de Trunks
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2004
    Messages
    534
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2004
    Messages : 534
    Points : 412
    Points
    412
    Par défaut
    J'ai utilisé la méthode que tu m'as donné, mais j'ai exactement le même résultat dans mon buffer de sortie .

    Exemple.cpp:

    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
    #include <Windows.h>
    #include <stdio.h>
    #include <tchar.h>
     
    void						test(LPCTSTR inputFile, LPCTSTR outputFile);
     
    int APIENTRY				WinMain(HINSTANCE hInstance,
    									HINSTANCE hPrevInstance,
    									LPSTR     lpCmdLine,
    									int       nCmdShow)
    {
    	test(TEXT("input_ansi.txt"), TEXT("output_ansi.txt"));
    	test(TEXT("input_utf8.txt"), TEXT("output_utf8.txt"));
    	test(TEXT("input_unicode.txt"), TEXT("output_unicode.txt"));
     
    	return 0;
    }
     
    void						test(LPCTSTR inputFile, LPCTSTR outputFile)
    {
    	FILE					*input;
    	FILE					*output;
    	TCHAR					buffer[256];
     
    	input = _tfopen(inputFile, TEXT("r"));
     
    	if (input)
    	{
    		output = _tfopen(outputFile, TEXT("w+"));
     
    		if (output)
    		{
    			while (_fgetts(buffer, 255, input))
    				_fputts(buffer, output);
    		}
     
    		fclose(output);
    		fclose(input);
    	}
    }

  9. #9
    Membre émérite
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Points : 2 799
    Points
    2 799
    Par défaut
    Attention.

    Si tu veux à la fois de l'unicode et de l'ansi, n'utilise pas les macros T, puisqu'elles sont résolues à la compilation.

    Sinon, de mémoire, sous windows, j'avais utilisé OpenFileW et associés (api win32, donc) pour lire/écrire un fichier en utf-8. Eventuellement, il faudrait gérer la BOM si elle est présente (elle a l'air, vu ce que ta boîte de dialogue affiche).

    Sinon, gtk ou qt doivent proposer ça en natif dans leurs apis fichiers, si tu peux les utiliser

  10. #10
    Membre averti Avatar de Trunks
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2004
    Messages
    534
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2004
    Messages : 534
    Points : 412
    Points
    412
    Par défaut
    Ce que je veux est de simplement récupérer sous forme de chaîne le contenu d'un fichier. Cette chaîne constitura par la suite une requête, mais peu importe pour le moment, cela ne change rien.

    La version _tfopen, _fgetts et _fputts est la meilleure solution car elle permet à la fois de compiler un projet Unicode, ainsi qu'un projet non unicode; d'où l'utilisation systématique de la macro TEXT.

    Cependant, le soucis réside dans la récupération des données copiés à l'intérieur d'un fichier. La chaîne est bonne pour un fichier encodé en ANSI, mais pour un fichier encodé en UTF-8 où Unicode, ça en marche pas correctement (voire post un peu plus haut).

    J'ai testé en compilant en mode _UNICODE et en mode standard, le résultat ne change pas. Je pense que le type d'encodage de la chaîne de réception n'interagit pas avec le résultat.

    Je vais jeter un oeil à OpenFileW, mais pas sur que ça change quelque-chose .

  11. #11
    Membre averti Avatar de Trunks
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2004
    Messages
    534
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2004
    Messages : 534
    Points : 412
    Points
    412
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Par contre, sous Visual 8 et supérieur, il y a une extension pour lire un fichier dans un encodage Unicode avec un simple FILE*.
    Je suis sous VC++ 6.0. Cependant ça compile. Est-ce parce-que mon compilateur est trop vieux que ça en donne pas le résultat escompté?

  12. #12
    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 as mal lu le lien que je t'ai passé. Je parlais du flag non-standard à ajouter au 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.

  13. #13
    Membre averti Avatar de Trunks
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2004
    Messages
    534
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2004
    Messages : 534
    Points : 412
    Points
    412
    Par défaut
    Oui je viens de voir

    Donc, ce n'est pas possible avec VC++ 6.0 de lire correctement un fichier encodé autre qu'en mode ANSI?

  14. #14
    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
    Pas sans le faire soi-même (lecture binaire + conversion).
    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.

  15. #15
    Membre averti Avatar de Trunks
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2004
    Messages
    534
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2004
    Messages : 534
    Points : 412
    Points
    412
    Par défaut
    Merci, je regarderai dans cette direction demain

  16. #16
    Membre averti Avatar de Trunks
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2004
    Messages
    534
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2004
    Messages : 534
    Points : 412
    Points
    412
    Par défaut
    J'ai trouvé un article qui va m'aider à comment m'y prendre pour résoudre le problème.
    http://www.michelcarrare.com/multimedia/codage-car.php

    Merci encore pour votre aide.

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

Discussions similaires

  1. Convertir un fichier UTF16 en Ansi sous python
    Par assoum27 dans le forum Général Python
    Réponses: 8
    Dernier message: 26/12/2012, 16h55
  2. convertir un fichier texte en ANSI
    Par sculpteur dans le forum Scripts/Batch
    Réponses: 6
    Dernier message: 08/10/2007, 11h38
  3. Convertir un fichier unicode en ansi?
    Par Faiche dans le forum C++
    Réponses: 7
    Dernier message: 06/10/2006, 08h15
  4. Convertir fichier.ISS en fichier.INF
    Par Furius dans le forum Windows
    Réponses: 9
    Dernier message: 15/10/2005, 11h53
  5. convertir fichier access97 en 2003
    Par seb53 dans le forum Access
    Réponses: 1
    Dernier message: 11/10/2005, 23h11

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