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
Partager