Bonsoir,
Après d'infructueuses recherches sur le site de GTK, je me tourne vers vous :
Existe-t-il une fonction retournant le jeu de caractères utilisé par un fichier texte ?
exemple : utf8, unicode ou ASCII
merci de vos réponses![]()
Bonsoir,
Après d'infructueuses recherches sur le site de GTK, je me tourne vers vous :
Existe-t-il une fonction retournant le jeu de caractères utilisé par un fichier texte ?
exemple : utf8, unicode ou ASCII
merci de vos réponses![]()
Il n'existe pas de fonction pour ça, il faut tester un certains nombres de jeux de caractères (généralement ISO-8859-15 et UTF-8).
Après certains fichiers, par exemple XML, contiennent le type d'encodage mais il n'est pas exclu que l'utilisateur ce soit trompé.
J'ai un bout de code qui traine pour faire mais je ne l'ai pas sous le coude, je le posterai ce soir![]()
Voici la version épurée de mon code :
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 #include <stdlib.h> #include <string.h> #include <glib.h> static const gchar *charsets[] = {"UTF-8", "ISO-8859-15", NULL}; static gboolean test_encoding (const gchar *path, const gchar *charset) { gboolean valid = FALSE; if (path != NULL) { gchar *content = NULL; g_file_get_contents (path, &content, NULL, NULL); if (content != NULL) { gchar *convert = NULL; gsize bytes_read = 0; convert = g_convert (content, -1, "UTF-8", charset, &bytes_read, NULL, NULL); if (convert != NULL) { if (bytes_read == strlen (content)) { valid = TRUE; } free (convert), convert = NULL; } free (content), content = NULL; } } return valid; } const gchar *encoding_get_charset (const gchar *path) { gint i; for (i = 0; charsets[i]; i++) { if (test_encoding (path, charsets[i])) { break; } } return charset[i]; }
Salut,
il existe une solution un peu moins élégante qui consiste à tester le fichier avec la commande file, par un tube. Au pire, le binaire "file" a un code source qui peut être obtenu (ou celui de gedit) mais là ça devient beaucoup plus complexe que le code ci-dessus.
J'ai galéré un moment là-dessus ...
Partager