Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

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

12 réponses
Avatar
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.

10 réponses

1 2
Avatar
Jean-Marc Bourguet
JKB writes:

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
Avatar
batyann811
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 ?
Avatar
JKB
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 writes:

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.
Avatar
JKB
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.
Avatar
batyann811
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...
Avatar
JKB
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.
Avatar
batyann811
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/
Avatar
batyann811
C'est l'algo utilisé dans firefox pour deviner l'encodage des pages web.
Le problème : ça n'est pas toujours fiable.
Avatar
Antoine Leca
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
Avatar
JKB
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.
1 2