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

SDL Discussion :

Fonctionnement d' Unicode


Sujet :

SDL

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 4
    Points : 3
    Points
    3
    Par défaut Fonctionnement d' Unicode
    Bonjour,

    Mon système est en UTF-8.
    J'ouvre un fichier texte(UTF-8), et je stocke la première chaine dans un char[] avec fgets.

    J'utilise la fonction : SDL_EnableUNICODE( 1 );
    Pour saisir un caractère ASCII, j'utilise : chaine[i] = (char)event.key.keysym.unicode;
    Pour saisir un caractère spécial, j'utilise : chaine[i] = event.key.keysym.unicode;

    event.key.keysym.unicode est de type Uint16 or le compilateur ne dit rien quand je le met dans un char pourquoi?

    Pour vérifier que la chaine chargée du fichier texte est identique à la chaine saisie, j'utilise : if (strcmp(chaine1,chaine2) == 0);
    Sans caractère spécial, la comparaison fonctionne.
    Avec, la chaine est dite différente dans tous les cas.

    Les caractères spéciaux des deux chaines s'affichent correctement avec TTF_RenderUTF8_Blended pour la chaine du fichier texte et
    TTF_RenderText_Blended pour la chaine saisie.

    Je suppose qu'il existe une fonction me permettant de faire la comparaison correctement, mais je ne la connaît pas, et je voudrai comprendre la différence
    entre le codage de event.key.keysym.unicode et le codage d'un caractère en UTF-8.

    Je suis un peu paumé et j'aimerai quelques éclaircissements svp.

    Le code entier : http://www.megaupload.com/?d=51PZJ3J0

  2. #2
    Expert éminent

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    pas grand chose à voir avec la SDL....

    Tu utilises strcmp ... donc les locales...
    A tu bien spécifié utf-8 come charset de la locale ?
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  3. #3
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 361
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 361
    Points : 20 381
    Points
    20 381
    Par défaut
    Citation Envoyé par squall90 Voir le message
    Mon système est en UTF-8.
    J'ouvre un fichier texte(UTF-8), et je stocke la première chaine dans un char[] avec fgets.
    Est- ce que tu sais ce que c'est le type char du langage C ( c++ aussi ) ?
    C'est un type de donnée codé sur 1 octet donc si tu as des charactères spéciaux cela ne fonctionnera pas parce que tu n'as que 256 possibilités.
    Donc il faut utiliser des types spéciaux comme wide char sous Windows par exemple.
    Sous Windows il ya des API win32 pour la gestion Unicode peut-être qu'il en existe pour le C standard.
    Mais il ne faut pas utiliser des char cela ne fonctionnera pas !
    Il faut que tu convertisses ce que tu récupères du clavier dans un format valide selon un code régional

    Citation Envoyé par squall90 Voir le message
    Mon système est en UTF-8.
    ?? UTF-8 c'est pour la représentation des pages HTML
    Windows par exemple n'est pas UTF-8 cela n'a rien à voir; Windows est configuré selon des extensions linguistiques et paramètres régionaux.

    J'ouvre un fichier texte(UTF-8), et je stocke la première chaine dans un char[] avec fgets.
    Est-ce que tu as jetté un coup d'oeil à savoir comment est écrit sur disque ton fichier texte en unicode ?
    En texte ANSI les charactères sont codés sur un octet soit 8bits
    En texte UNICODE ils tiennent sur 16bits soit le double.
    Tu peux le voir en ouvrant ton fichier en binaire avec un éditeur hexadécimal ou bien avec Debug de ms-dos
    fgets c'est pour des charactères ANSI sur 8bits donc c'est pas cela qu'il faut utiliser c'est son équivalent UNICODE qui est fgetws() qu'il faut appeler.

  4. #4
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    je voudrai comprendre la différence
    entre le codage de event.key.keysym.unicode et le codage d'un caractère en UTF-8
    Il faudrait commencer par savoir quel encodage est utilisé par SDL pour l'Unicode. Visiblement il s'agirait d'UTF-16 puisque tu récupères un Int16, donc les caractères non ASCII seront bien différents de leur version UTF-8. Pour effectuer des comparaisons il faut que tu travailles avec un encodage unique.

    C'est un type de donnée codé sur 1 octet donc si tu as des charactères spéciaux cela ne fonctionnera pas parce que tu n'as que 256 possibilités.
    Donc il faut utiliser des types spéciaux comme wide char sous Windows par exemple.
    Comme son nom l'indique, UTF-8 utilise un codage sur des entiers 8 bits. Donc le type char va très bien (du moins sur la plupart des plateformes actuelles).

    UTF-8 c'est pour la représentation des pages HTML
    UTF-8 est un encodage permettant de coder tous les caractères défini par la norme Unicode. Absolument rien à voir avec HTML, si ce n'est que HTML,tout comme la plupart des protocoles manipulant du texte, supporte UTF-8.
    Un peu de bonne lecture sur le sujet ne ferait pas de mal, avant d'avancer des sotises pareilles

    Windows par exemple n'est pas UTF-8 cela n'a rien à voir
    Ca a un peu à voir tout de même. Certains systèmes Unix utilisent UTF-8 pour leur système de fichiers. De même qu'ils utilisent généralement UTF-8 pour l'édition de texte, mais ça j'imagine que ça dépend surtout de l'éditeur utilisé.

    En texte ANSI les charactères sont codés sur un octet soit 8bits
    Pas forcément. La plupart des pages de code régionales ont des caractères définis sur 8 bits, mais pas toutes. Par exemple le shift-JIS (japonais) définit des caractères sur 16 bits.

    En texte UNICODE ils tiennent sur 16bits soit le double.
    Unicode n'est qu'un standard qui définit entre autres différents encodages. Ca ne "tient" pas sur X bits.
    Ce qui tient sur 16 bits en revanche ce sont les caractères d'UTF-16, mais il existe aussi UTF-32, UTF-8 et UTF-7 entre autres.

    Unicode est généralement un sujet assez chaud, mieux vaut éviter de lancer n'importe quelle ânerie si on n'est pas sûr de ce que l'on dit.

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 4
    Points : 3
    Points
    3
    Par défaut
    Citation Envoyé par nicroman Voir le message
    pas grand chose à voir avec la SDL....

    Tu utilises strcmp ... donc les locales...
    A tu bien spécifié utf-8 come charset de la locale ?
    J'ai ajouté setlocale (LC_ALL, "fr_FR.utf8"); mais cela ne change rien, en fait je suis sous GNU/Linux et locale revoie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    LANG=fr_FR.utf8
    LC_CTYPE="fr_FR.utf8"
    LC_NUMERIC="fr_FR.utf8"
    LC_TIME="fr_FR.utf8"
    LC_COLLATE=C
    LC_MONETARY="fr_FR.utf8"
    LC_MESSAGES="fr_FR.utf8"
    LC_PAPER="fr_FR.utf8"
    LC_NAME="fr_FR.utf8"
    LC_ADDRESS="fr_FR.utf8"
    LC_TELEPHONE="fr_FR.utf8"
    LC_MEASUREMENT="fr_FR.utf8"
    LC_IDENTIFICATION="fr_FR.utf8"
    LC_ALL=
    Donc je ne crois pas que le problème soit ici.
    J'utilise Code::Blocks qui fonctionne en UTF8 lui aussi.

    Il faudrait commencer par savoir quel encodage est utilisé par SDL pour l'Unicode. Visiblement il s'agirait d'UTF-16 puisque tu récupères un Int16, donc les caractères non ASCII seront bien différents de leur version UTF-8. Pour effectuer des comparaisons il faut que tu travailles avec un encodage unique.
    Il faudrait donc convertir le event.key.keysym.unicode de la SDL en UTF8? Si oui comment? (je vais chercher mais l'Unicode a l'air si compliqué que je ne dirai pas non à une réponse sur un plateau.)

    Merci à tous pour votre aide.

  6. #6
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Oui, Unicode ça a l'air si compliqué et pourant ça ne l'est pas tant que ça

    A priori un truc assez répandu sous Linux pour les conversions c'est libiconv, mais je n'en sais pas plus.

    Tu as aussi le code source de référence donné sur le site de l'Unicode, qui peut être repris tel quel :
    http://www.unicode.org/Public/PROGRA...F/ConvertUTF.h
    http://www.unicode.org/Public/PROGRA...F/ConvertUTF.c

    Ensuite quelques liens utiles au cas où tu voudrais essayer de démystifier un peu tout ça :
    The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets
    Convertisseur Unicode en ligne, pratique pour faire des tests rapides

    Bon courage.

  7. #7
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 4
    Points : 3
    Points
    3
    Par défaut
    Merci bien, je vais aller voir tout ça.

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

Discussions similaires

  1. SELECT qui ne fonctionne pas, problème unicode ?
    Par GoustiFruit dans le forum Bases de données
    Réponses: 16
    Dernier message: 25/11/2011, 16h07
  2. Réponses: 9
    Dernier message: 14/11/2006, 12h09
  3. [Turbo Pascal] TP7 fonctionne en QWERTY
    Par callahan dans le forum Turbo Pascal
    Réponses: 9
    Dernier message: 08/02/2003, 21h49
  4. Prb de fonctionnement dans SaveDialog avecInitialDir
    Par boyerf dans le forum Composants VCL
    Réponses: 4
    Dernier message: 12/12/2002, 21h46
  5. ca ne fonctionne pas (generateur auto-incrémentant)
    Par tripper.dim dans le forum SQL
    Réponses: 7
    Dernier message: 26/11/2002, 00h10

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