Forum Programmation.c wchar_t, conversion multibyte et Unicode...

Posté par  .
Étiquettes : aucune
0
15
nov.
2005
Bonsoir à tous :)

J'aurais encore une fois besoin de votre expertise pour cette fois les chaînes de caractère unicode.

J'ai commencé à coder un module pour gérer les chaînes, ajouté le support unicode, et tout semble marcher à peu près correctement, sauf l'affichage...

Quand je veux afficher une chaine qui contient vraiment des caractères spéciaux (par exemple des kanjis ou des voyelles avec umlaut), bah le printf ne l'affiche pas (pourtant avec %ls).

Interloqué, j'ai donc vérifié le contenu de ma chaine en l'affichant caractère par caractère avec putwchar(), et là tout apparaît sans problème.

J'en ai donc déduit (à tort ?) qu'une conversion wchar_t->multibyte devait avoir lieu en fourbe dans printf()... J'ai alors codé une fonction pour faire la conversion manuellement avec wcstombs(3). Mais quand je l'utilise, il s'avère que celle ci échoue avec "Invalid or incomplete multibyte or wide character"...

Comme j'ai une locale douteuse (en_US.eucJP), j'ai envoyé mon code à un ami windowsien qui a testé ça sous Dev-C++, et le programme semble marcher correctement, sauf que la console windows affiche Û au lieu de é. Ça arrive souvent avec d'autres programmes, mais ne serait-ce pas du à une mauvaise gestion de l'unicode dans mon code (et celui des autres programmes qui font ça) ?

J'ai mis mon code en ligne ici:
http://mammouth.tuxfamily.org/m_string.c
http://mammouth.tuxfamily.org/m_string.h

Je vous serais extrêmement reconnaissant si vous pouviez jeter un coup d'oeil et me dire si chezvousçamarche® ou bien ce qui ne va pas...

À défaut, des pointeurs sur de bons sites portant sur la gestion de l'unicode en C ISO seraient les très bienvenus !

Merci d'avoir lu ce long post jusqu'au bout, et merci d'avance pour vos réponses :)
  • # glib ?

    Posté par  . Évalué à 1.

    j'ai envie de dire, pourquoi tu n'utilises pas la glib (http://developer.gnome.org/doc/API/2.0/glib/) au lieu de réinventer la roue...

    si tu utilises des wchar_t -> wprintf()
    • [^] # Re: glib ?

      Posté par  . Évalué à 0.

      La glib fait bien plus que gérer des chaînes de caractères, c'est un peu un lance roquette pour tuer une mouche (et une dépendance en plus) dans mon cas. "Réinventer la roue" présente deux avantage : ça me permet d'apprendre comment coder une application gérant UTF8 proprement (j'espère ^_^'), et de ne dépendre que d'un compilo compatible ISO C au final.

      Pour wprintf, j'y ais pensé mais apparemment la seul différence avec le printf de base c'est qu'il accepte un format en wchar_t -- printf("%ls", bidule); et wprintf(L"%ls", bidule); font exactement la même chose :)
      • [^] # Re: glib ?

        Posté par  . Évalué à 1.

        T'es sûr qu'en utilisant des wchar_t t'utilise des chaînes encodées en UTF-8 ? Pour ma part j'en doute fortement...
        • [^] # Re: glib ?

          Posté par  . Évalué à 1.

          La nuit porte conseil... Il s'agissait d'un problème de locales. En lançant une konsole avec LC_ALL=de_DE.UTF-8 et LANG=de_DE.UTF-8, et avec un setlocale(LC_CTYPE, ""), j'ai une sortie conforme à ce que j'attendais:

          jaguarwan@Jaguar:~/Projects/MammouthServer-0.3$ LC_ALL=de_DE.UTF-8 LANG=de_DE.UTF-8 ./a.out
          Schöne Grüße
          * allocating bouga
          -> Multibyte conversion: bouga
          * testing string_cpy
          -> bouga is a copy of bouga
          * allocating coin
          * testing string_pre
          -> bougacoin was prepended bouga
          * testing string_cat
          -> bougacoinbouga was appended bouga
          * testing string_del
          * testing string creation with string_cmov
          Sch�e Gr� <--- affichage brut du contenu de la chaine avec putwchar()
          -> Multibyte conversion: Schöne Grüße
          -> Schöne Grüße was created using string_cpre
          * testing string_upper
          -> SCHÖNE GRÜßE was converted to upper case
          * testing string_lower
          -> schöne grüße was converted to lower case

          M'enfin, maintenant reste à faire cohabiter ça avec des chaines binaires :]

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.