Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

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

3 views
Skip to first unread message

JKB

unread,
Nov 24, 2009, 10:10:48 AM11/24/09
to
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.

Jean-Marc Bourguet

unread,
Nov 24, 2009, 10:44:20 AM11/24/09
to
JKB <knat...@koenigsberg.fr> 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

batyann811

unread,
Nov 24, 2009, 10:45:41 AM11/24/09
to
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

unread,
Nov 24, 2009, 10:46:22 AM11/24/09
to
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 <knat...@koenigsberg.fr> 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

unread,
Nov 24, 2009, 10:49:33 AM11/24/09
to
Le 24-11-2009, ? propos de
Re: Trouver l'encodage correspondant à une chaîne de caractères,
batyann811 ?crivait dans fr.comp.lang.c :

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 ;-)

batyann811

unread,
Nov 24, 2009, 11:01:31 AM11/24/09
to
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

unread,
Nov 24, 2009, 11:05:04 AM11/24/09
to
Le 24-11-2009, ? propos de
Re: Trouver l'encodage correspondant à une chaîne de caractères,
batyann811 ?crivait dans fr.comp.lang.c :

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.

batyann811

unread,
Nov 24, 2009, 11:25:25 AM11/24/09
to
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

unread,
Nov 24, 2009, 11:27:33 AM11/24/09
to
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

unread,
Nov 24, 2009, 11:39:31 AM11/24/09
to
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

unread,
Nov 25, 2009, 10:40:32 AM11/25/09
to
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 :

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

-ed-

unread,
Nov 26, 2009, 5:24:51 AM11/26/09
to
On 24 nov, 17:39, Antoine Leca <r...@localhost.invalid> wrote:
> C assume un encodage des caractères (représenté par LC_CTYPE), et le

Hum... Faux ami. 'assume' = 'suppose' en français...

Le C fait l'hypothèse d'un encodage des caractères <...>

Antoine Leca

unread,
Nov 26, 2009, 10:02:26 AM11/26/09
to
-ed- a �crit :

> On 24 nov, 17:39, Antoine Leca <r...@localhost.invalid> wrote:
>> C assume un encodage des caract�res (repr�sent� par LC_CTYPE), et le
>
> Hum... Faux ami. 'assume' = 'suppose' en fran�ais...
>
> Le C fait l'hypoth�se d'un encodage des caract�res <...>

Merci. J'ai cherch� le mot (par ce que assume sonnait mal), mais je n'ai
pas trouv� sur le coup. Et comme autour de moi j'entend trop souvent le
m�me usage impropre de /asumir/ ou /assumir/ au lieu de /suponer/...


Antoine

0 new messages