IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

unicode-utf8 application multi langue


Sujet :

C

  1. #1
    Membre habitué
    Homme Profil pro
    root
    Inscrit en
    Janvier 2013
    Messages
    174
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : root

    Informations forums :
    Inscription : Janvier 2013
    Messages : 174
    Points : 144
    Points
    144
    Par défaut unicode-utf8 application multi langue
    Salut à tous.
    Je suis débutant en C.

    J'ai du mal à apprendre/choisir/appliquer une méthode pour faire une application avec des accents de différent langages.
    (ÉDITE tardive: pas pour une internationalisation, mais un support pour bien afficher les caractères (é, è, ç, ğ, ı, etc), les caractères de langage russe, arabique ou autres.)

    Pour mon cas:
    Je développe mon application sous linux pour linux, mais (avec très très faible chance, histoire de prendre précaution,) il pourrait être portable pour windows.

    Que me conseillez vous ? Qu'utilisez-vous ?

  2. #2
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    C'est une application console ou graphique ?

  3. #3
    Membre habitué
    Homme Profil pro
    root
    Inscrit en
    Janvier 2013
    Messages
    174
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : root

    Informations forums :
    Inscription : Janvier 2013
    Messages : 174
    Points : 144
    Points
    144
    Par défaut
    Les deux.

    Pour la partie graphique je voudrais faire de l'affichage texte (sur opengl), via comme freetype.

    Pour la partie console, soit c'est pour accompagné mon logiciel graphique (pour m'afficher des informations) soit une application à part à lui seul.

  4. #4
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Je ne connais pas SDL, mais si j'ai bien compris, c'est vraiment plus une bibliothèque de dessin qu'un framework applicatif. Peu probable qu'il embarque des API d'internalisation mais cette affirmation est gratuite et à vérifier.

    Qt par exemple possède cela. En plus, il permet de gérer en même temps une console.

    Dans ton cas (et si mon affirmation est correcte), il faudrait trouver une bibliothèque internationalisation en C et indépendante, pour pouvoir l'utiliser dans l'application SDL d'une partie et l’éventuelle application console d'autre part.

  5. #5
    Membre habitué
    Homme Profil pro
    root
    Inscrit en
    Janvier 2013
    Messages
    174
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : root

    Informations forums :
    Inscription : Janvier 2013
    Messages : 174
    Points : 144
    Points
    144
    Par défaut
    Je comptes pas utiliser SDL.
    SDL est un niveau plus haut que X et Wayland, mon but est de faire directement sur le niveau X et Wayland, en gros mon application aura le même niveau que SDL mais avec les personnalisations de mon choix.


    J'ai un peu recherché sur google.
    Pour une première recherche tous reste flou, il semblerait qu'il y a des différences unicode, utf, wide, les nouvelles normes etc pas mal de chose qui peut rendre à l'erreur l'application si on s'y connait pas en détails.
    UTF-8 semble bon, je vais recherché en profondeur.

  6. #6
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 291
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 291
    Points : 4 941
    Points
    4 941
    Billets dans le blog
    5
    Par défaut
    Bonsoir.

    La Glib gère l'internationalisation par exemple avec les macros gettext.

    Un début de piste peut-être...

  7. #7
    Membre habitué
    Homme Profil pro
    root
    Inscrit en
    Janvier 2013
    Messages
    174
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : root

    Informations forums :
    Inscription : Janvier 2013
    Messages : 174
    Points : 144
    Points
    144
    Par défaut
    Merci pour vos réponses.

    Je crois m'être mal expliquer.
    En fait ce qu'il me faut, c'est le support des caractères (é, è, ç, ğ, ı, etc), les caractères de langage russe ou arabique. Pas pour un internationalisation, mais pour un affichage normal du caractère.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #include <stdlib.h>
    #include <stdio.h>
     
    int main()
    {
            char texte = 'é';
            printf("%c \n", texte);
    return 0;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    gcc test.c -o main
    test.c: In function ‘main’:
    test.c:6:15: warning: multi-character character constant [-Wmultichar]
      char texte = 'é';
                   ^
    test.c:6:15: warning: overflow in implicit constant conversion [-Woverflow]
    Merci encore de vos aides.

  8. #8
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 291
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 291
    Points : 4 941
    Points
    4 941
    Billets dans le blog
    5
    Par défaut
    Ha ! En effet je suis un peu à côté de la plaque .

    L'utilisation de l'utf-8 est l'une des réponses. Il existe aussi l'utf-16. Disons pour faire court que l'utf-8 par rapport à l'utf-16 est que, selon le caractère choisi, l'utf-8 prendra plus de place en mémoire que l'autre.

    Maintenant, pour être plus pratique, si tu désires utiliser l'un ou l'autre dans ton code source il suffit simplement que ton code source (le fichier texte) soit sauvé dans ce format.

    Attention tout de même. Si tu accèdes à du texte extérieur à ton code source, par exemple en lisant un fichier texte, il te faudra vérifier si ce texte en dans le code choisi. Dans le cas contraire il te faudra utiliser une bibliothèque adéquate pour le convertir (La Glib sait faire ca aussi ).

    En espérant être revenu sur la plaque...

  9. #9
    Membre habitué
    Homme Profil pro
    root
    Inscrit en
    Janvier 2013
    Messages
    174
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : root

    Informations forums :
    Inscription : Janvier 2013
    Messages : 174
    Points : 144
    Points
    144
    Par défaut
    Mon éditeur texte est par défaut sur utf-8, mais j'ai quand même testé un nouveau fichier utf-8, set file type programming C.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #include <stdlib.h>
    #include <stdio.h>
     
    int main()
    {
    	printf("Salut lés amis. \n");
    	char a = 'a';
    	printf("teste: %c \n", a);
    	char b = 'é';
    	printf("teste: %c \n", b);
    	return 0;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $ gcc a.c -o a
    a.c: In function ‘main’:
    a.c:9:11: warning: multi-character character constant [-Wmultichar]
      char b = 'é';
               ^
    a.c:9:11: warning: overflow in implicit constant conversion [-Woverflow]
    ./a
    Salut lés amis.
    teste: a
    teste: �

  10. #10
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 291
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 291
    Points : 4 941
    Points
    4 941
    Billets dans le blog
    5
    Par défaut
    Je dirais simplement que le compilo hurle, ce qui est normal . L'utf-8 est encodé au minimum sur 2 octets !

    Voila un lien qui résume la question : http://www.fil.univ-lille1.fr/~salso...codeUTF-8.html

  11. #11
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 631
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 631
    Points : 10 559
    Points
    10 559
    Par défaut
    Il faut utiliser <wchar.h> et wchar_t
    Documentation

    Mais après un petit test avec des caractères russes, cela ne semble pas fonctionner comme on l'attend (*)
    Surtout que le terminal doit être en UTF-8 et cela, ce n'est pas gagné

    Et l'autre truc, mais à vérifier, toutes les libraires sont fournies en UTF-8 (pour les include): donc il faut oublier UTF-16 et UTF-32

    Citation Envoyé par gerald3d Voir le message
    L'utilisation de l'utf-8 est l'une des réponses. Il existe aussi l'utf-16. Disons pour faire court que l'utf-8 par rapport à l'utf-16 est que, selon le caractère choisi, l'utf-8 prendra plus de place en mémoire que l'autre.
    • UTF-8: compatibilité ASCII
    • UTF-16: compromis compatibilité et performances
    • UTF-32: performances


    * -> La réponse (du moins 1 réponse) a été donnée juste ci-dessous: il faut configurer la locale avant de coder

  12. #12
    Membre habitué
    Homme Profil pro
    root
    Inscrit en
    Janvier 2013
    Messages
    174
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : root

    Informations forums :
    Inscription : Janvier 2013
    Messages : 174
    Points : 144
    Points
    144
    Par défaut
    J’arrive pas a utilisé wchar, pouvez vous me donné des exemples fonctionnel.

    Les accents on peut les utilisé directement dans le fichier source qui est en utf-8 ? ou il faut obligatoirement ajouté le code équivalent à la lettre accentué ?


    Le code dessous me renvoi un: ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #include <stdlib.h>
    #include <stdio.h>
    #include <wchar.h>
     
    int main()
    {
    	wchar_t texte = L'é';
    	wprintf(L"%lc", texte);
     
    	return 0;
    }

  13. #13
    Membre émérite
    Avatar de Daïmanu
    Homme Profil pro
    Développeur touche à tout
    Inscrit en
    Janvier 2011
    Messages
    696
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur touche à tout

    Informations forums :
    Inscription : Janvier 2011
    Messages : 696
    Points : 2 439
    Points
    2 439
    Par défaut
    Citation Envoyé par gerald3d Voir le message
    L'utf-8 est encodé au minimum sur 2 octets !
    Pas tout à fait.
    L'utf-8 encode les caractères sur plusieurs octets, de 1 à 4. char a une taille de 1 byte (disons 1 octet pour simplifier). « é » encodé en utf-8 occupe deux octets en mémoire, ce qui ne rentre pas dans le char, d'où le cri du compilo.

    La taille d'un wchar_t dépend du compilateur.

    L'utf-16 encode toujours les caractères sur deux octets.

    L'avantage de l'utf-8, c'est sa compatibilité avec ASCII (les caractères ASCII ont le même code en utf-8, sur un octet), l’avantage de l'utf-16 c'est la constance dans la taille qu'occupe un caractère en mémoire (deux octets) ce qui simplifie la manipulation des caractères.


    Citation Envoyé par kripteks Voir le message
    Le code dessous me renvoi un: ?
    Ceci devrait mieux fonctionner :
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #include <stdlib.h>
    #include <stdio.h>
    #include <wchar.h>
    #include <locale.h>
     
    int main()
    {
    	setlocale(LC_CTYPE, "");
    	wchar_t texte = L'é';
    	wprintf(L"%lc", texte);
     
    	return 0;
    }
    Je fais appel aux esprits de Ritchie, Kernighan, Stroustrup et Alexandrescu
    Donnez moi la force, donnez moi le courage de coder proprement !

    « Ça marche pas » n'est PAS une réponse convenable, merci de détailler le souci en fournissant l’environnement, le code source, les commandes et les messages d'erreur.

    Ce club possède également un clavardage, on y trouve quelques perles entre deux sessions d'entraides.

  14. #14
    Membre habitué
    Homme Profil pro
    root
    Inscrit en
    Janvier 2013
    Messages
    174
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : root

    Informations forums :
    Inscription : Janvier 2013
    Messages : 174
    Points : 144
    Points
    144
    Par défaut
    Et ben c'est parfait.

    Avec #include <locale.h> et setlocale(LC_CTYPE, ""); le résultat est bon.


    Merci à tous pour votre aide.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Bien créer une application multi-langues ? Unicode ou non ?
    Par Maxime Abbey dans le forum Composants VCL
    Réponses: 28
    Dernier message: 10/09/2007, 17h20
  2. Application Multi-langues en C#
    Par ayobo dans le forum Windows Forms
    Réponses: 2
    Dernier message: 27/11/2006, 16h42
  3. Application multi-langue [Delphi 7]
    Par guence dans le forum Delphi
    Réponses: 3
    Dernier message: 05/09/2006, 12h43
  4. Application multi-langue
    Par JerBi dans le forum EDI
    Réponses: 2
    Dernier message: 15/09/2005, 02h22
  5. [Application multi-langues] Compilateur ou fichier lng ?
    Par Teb dans le forum Composants VCL
    Réponses: 5
    Dernier message: 16/08/2005, 16h48

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo