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
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
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
CafuroCafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
e-verbeUn logiciel de conjugaison des verbes de la langue française.
Ma page personnelle sur DVP.
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:
Mais ça me génère une exception au niveau de imbue() ...
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"));
un programme qui s'appelle iconv !
il te transforme un fichier d'un certain character set en un autre.
... tres tres utile.
a+
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.
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:
Ainsi que 3 fichiers test.
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(); }
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):
Et voici le résultat du test:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 Unicode- Ligne 1 Unicode- Ligne 2 Unicode- Ligne 3
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
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.
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); } }
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
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.
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.
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?
Code : Sélectionner tout - Visualiser dans une fenêtre à part , ccs=<encoding>
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.
Merci, je regarderai dans cette direction demain
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.
Partager