Trouver l'encodage correspondant à une chaîne de caractères

Le
JKB
Bonjour à tous,

Je suis confronté à un problème sournois Je dois convertir en
UTF-8 une chaîne de caractères composée en à peu près n'importe quoi
allant de l'ANSI à l'UTF8 en passant par toutes les déclinaisons de
l'ISO8859. Si je connais l'encodage de la source, c'est facile, il
me suffit d'utiliser la libiconv. Par contre, comment faire pour
déterminer l'encodage de la source ? Je n'ai rien trouvé d'efficace
jusqu'ici

Cordialement,

JKB

--
Le cerveau, c'est un véritable scandale écologique. Il représente 2% de notre
masse corporelle, mais disperse à lui seul 25% de l'énergie que nous
consommons tous les jours.
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses Page 1 / 2
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Jean-Marc Bourguet
Le #20622551
JKB
Je suis confronté à un problème sournois... Je dois convertir en
UTF-8 une chaîne de caractères composée en à peu près n'importe quoi
allant de l'ANSI à l'UTF8 en passant par toutes les déclinaisons de
l'ISO8859. Si je connais l'encodage de la source, c'est facile, il
me suffit d'utiliser la libiconv. Par contre, comment faire pour
déterminer l'encodage de la source ? Je n'ai rien trouvé d'efficace
jusqu'ici...



Avec ces contraintes, les seuls moyens que j'envisage sont bases sur une
hypothese des langues et d'analyse de la probabilite que le texte soit bien
dans ces langues pour chaque codage envisage. Pas simple.

A+

--
Jean-Marc
FAQ de fclc: http://www.levenez.com/lang/c/faq
Site de usenet-fr: http://www.usenet-fr.news.eu.org
batyann811
Le #20622541
JKB a écrit :
Bonjour à tous,

Je suis confronté à un problème sournois... Je dois convertir en
UTF-8 une chaîne de caractères composée en à peu près n'importe quoi
allant de l'ANSI à l'UTF8 en passant par toutes les déclinaisons de
l'ISO8859. Si je connais l'encodage de la source, c'est facile, il
me suffit d'utiliser la libiconv. Par contre, comment faire pour
déterminer l'encodage de la source ? Je n'ai rien trouvé d'efficace
jusqu'ici...

Cordialement,

JKB




Aucune idée. J'aurais même tendance à dire que c'est impossible. Je
dirais qu'il faut au minimum savoir dans qu'elle langue est écrite ta
chaîne d'origine et encore ça doit rester coton. T'es sûr que c'est
possible ?
JKB
Le #20622531
Le 24-11-2009, ? propos de
Re: Trouver l'encodage correspondant à une chaîne de caractères,
Jean-Marc Bourguet ?crivait dans fr.comp.lang.c :
JKB
Je suis confronté à un problème sournois... Je dois convertir en
UTF-8 une chaîne de caractères composée en à peu près n'importe quoi
allant de l'ANSI à l'UTF8 en passant par toutes les déclinaisons de
l'ISO8859. Si je connais l'encodage de la source, c'est facile, il
me suffit d'utiliser la libiconv. Par contre, comment faire pour
déterminer l'encodage de la source ? Je n'ai rien trouvé d'efficace
jusqu'ici...



Avec ces contraintes, les seuls moyens que j'envisage sont bases sur une
hypothese des langues et d'analyse de la probabilite que le texte soit bien
dans ces langues pour chaque codage envisage. Pas simple.



Aïe... J'ai essayé de voir comment faisait l'utilitaire iconv qui
arrive à se passer de l'option 'from', mais c'est tellement fouilli
que j'ai un peu de mal à voir.

JKB

--
Le cerveau, c'est un véritable scandale écologique. Il représente 2% de notre
masse corporelle, mais disperse à lui seul 25% de l'énergie que nous
consommons tous les jours.
JKB
Le #20622681
Le 24-11-2009, ? propos de
Re: Trouver l'encodage correspondant à une chaîne de caractères,
batyann811 ?crivait dans fr.comp.lang.c :
JKB a écrit :
Bonjour à tous,

Je suis confronté à un problème sournois... Je dois convertir en
UTF-8 une chaîne de caractères composée en à peu près n'importe quoi
allant de l'ANSI à l'UTF8 en passant par toutes les déclinaisons de
l'ISO8859. Si je connais l'encodage de la source, c'est facile, il
me suffit d'utiliser la libiconv. Par contre, comment faire pour
déterminer l'encodage de la source ? Je n'ai rien trouvé d'efficace
jusqu'ici...

Cordialement,

JKB




Aucune idée. J'aurais même tendance à dire que c'est impossible. Je
dirais qu'il faut au minimum savoir dans qu'elle langue est écrite ta
chaîne d'origine et encore ça doit rester coton. T'es sûr que c'est
possible ?



Je n'en sais rien, mais j'aurais tendance à dire que oui vu que
iconv se démerde sur des fichiers (et que file -i est capable de sortir
l'encodage d'un fichier). Mon problème est que j'ai un
service qui tourne sur une socket (pour du géocodage d'adresses) et
que certains clients m'envoient des trucs dans une forme pour le
moins bizarre. Aujourd'hui, je récupère les données, j'envoie les
données dans un fichier et je convertis ce fichier en utf8 avant de
le relire. C'est loin d'être optimal...

J'oubliais, il est bien entendu interdit de demander aux différents
clients de fournir un truc propre, sinon, ce ne serait pas drôle ;-)

JKB

--
Le cerveau, c'est un véritable scandale écologique. Il représente 2% de notre
masse corporelle, mais disperse à lui seul 25% de l'énergie que nous
consommons tous les jours.
batyann811
Le #20622671
JKB a écrit :

Je n'en sais rien, mais j'aurais tendance à dire que oui vu que
iconv se démerde sur des fichiers (et que file -i est capable de sortir
l'encodage d'un fichier).



Tu as essayé de les tester sur des textes en différentes langues (russe,
grec, suédois...) pour voir si les résultats de ces commandes sont bien
fiables ? J'ai vu file se gourer plus d'une fois sur des types de
fichiers...
JKB
Le #20622811
Le 24-11-2009, ? propos de
Re: Trouver l'encodage correspondant à une chaîne de caractères,
batyann811 ?crivait dans fr.comp.lang.c :
JKB a écrit :

Je n'en sais rien, mais j'aurais tendance à dire que oui vu que
iconv se démerde sur des fichiers (et que file -i est capable de sortir
l'encodage d'un fichier).



Tu as essayé de les tester sur des textes en différentes langues (russe,
grec, suédois...) pour voir si les résultats de ces commandes sont bien
fiables ? J'ai vu file se gourer plus d'une fois sur des types de
fichiers...



Non, je n'ai pas fait plus de tests que ça. Je reçois des adresses,
donc mon problème s'arrête à l'encodage des signes diacritiques,
bref, de tout ce qui peut composer une adresse et qui n'est pas dans
l'ASCII de base. Dans ce cas précis, file -i fonctionne plutôt pas
mal.

JKB

--
Le cerveau, c'est un véritable scandale écologique. Il représente 2% de notre
masse corporelle, mais disperse à lui seul 25% de l'énergie que nous
consommons tous les jours.
batyann811
Le #20623001
JKB a écrit :

Non, je n'ai pas fait plus de tests que ça. Je reçois des adresses,
donc mon problème s'arrête à l'encodage des signes diacritiques,
bref, de tout ce qui peut composer une adresse et qui n'est pas dans
l'ASCII de base. Dans ce cas précis, file -i fonctionne plutôt pas
mal.

JKB




Il existe http://www.mozilla.org/projects/intl/chardet.html qui peut
peut être t'aider. Mais ça a l'air noyé dans les sources de firefox.

Sinon il y a un portage en java http://jchardet.sourceforge.net/
batyann811
Le #20622991
C'est l'algo utilisé dans firefox pour deviner l'encodage des pages web.
Le problème : ça n'est pas toujours fiable.
Antoine Leca
Le #20623111
JKB écrivit :
Je dois convertir en
UTF-8 une chaîne de caractères composée en à peu près n'importe quoi
allant de l'ANSI à l'UTF8 en passant par toutes les déclinaisons de
l'ISO8859. Si je connais l'encodage de la source, c'est facile, il
me suffit d'utiliser la libiconv. Par contre, comment faire pour
déterminer l'encodage de la source ? Je n'ai rien trouvé d'efficace
jusqu'ici...



Pas sûr de bien voir la question sur le langage C.
Mais bon, on va supposer qu'il y en a bien une.

C assume un encodage des caractères (représenté par LC_CTYPE), et le
suppose unique et indéterminé pour le programmeur. Si ton compilateur
(et surtout la bibliothèque standard) dispose de caractères élargis
(wchar_t) encodés en Unicode, le plus simple ÀMHA est de faire confiance
à l'utilisateur et d'écrire


setlocale(LC_CTYPE, "");

/*...*/

wchat_t données[N];

if( !fgetws(données, N, flux_entrée) ) ouin_ouin();
/* ... ou bien utiliser mbs[r]towcs() ... */

... et il ne te reste plus qu'à décortiquer les wchar_t en unsigned
char[*] au standard utf8 (Google), puis éventuellement d'écrire le
résultat dans un flux binaire.


Avec des implémentations très récentes, tu peux même te risquer à
utiliser mbrtoc16() ou mbrtoc32() (ISO/CÉI RT 19769:2004,
www.open-std.org/JTC1/SC22/WG14/www/docs/n1040.pdf.)


Antoine
JKB
Le #20630511
Le 24-11-2009, ? propos de
Re: Trouver l'encodage correspondant à une chaîne de caractères,
Antoine Leca ?crivait dans fr.comp.lang.c :
JKB écrivit :
Je dois convertir en
UTF-8 une chaîne de caractères composée en à peu près n'importe quoi
allant de l'ANSI à l'UTF8 en passant par toutes les déclinaisons de
l'ISO8859. Si je connais l'encodage de la source, c'est facile, il
me suffit d'utiliser la libiconv. Par contre, comment faire pour
déterminer l'encodage de la source ? Je n'ai rien trouvé d'efficace
jusqu'ici...



Pas sûr de bien voir la question sur le langage C.
Mais bon, on va supposer qu'il y en a bien une.

C assume un encodage des caractères (représenté par LC_CTYPE), et le
suppose unique et indéterminé pour le programmeur. Si ton compilateur
(et surtout la bibliothèque standard) dispose de caractères élargis
(wchar_t) encodés en Unicode, le plus simple ÀMHA est de faire confiance
à l'utilisateur et d'écrire


setlocale(LC_CTYPE, "");

/*...*/

wchat_t données[N];

if( !fgetws(données, N, flux_entrée) ) ouin_ouin();
/* ... ou bien utiliser mbs[r]towcs() ... */

... et il ne te reste plus qu'à décortiquer les wchar_t en unsigned
char[*] au standard utf8 (Google), puis éventuellement d'écrire le
résultat dans un flux binaire.


Avec des implémentations très récentes, tu peux même te risquer à
utiliser mbrtoc16() ou mbrtoc32() (ISO/CÉI RT 19769:2004,
www.open-std.org/JTC1/SC22/WG14/www/docs/n1040.pdf.)



Merci pour toutes ces pistes, je vais creuser...

Cordialement,

JKB

--
Le cerveau, c'est un véritable scandale écologique. Il représente 2% de notre
masse corporelle, mais disperse à lui seul 25% de l'énergie que nous
consommons tous les jours.
Publicité
Poster une réponse
Anonyme