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 :

Comment écrire des caractères non-ASCII?


Sujet :

C

  1. #1
    Invité
    Invité(e)
    Par défaut Comment écrire des caractères non-ASCII?
    Bonjour,

    Débutant en C, j'essaye d'écrire une fonction qui puisse afficher les caractères qui ont une valeur comprise entre 128 et 255.
    Pour ce-faire, je souhaite utiliser la fonction write.
    J'ai trouvé comment fonctionne le principe. Je dois appliquer une sorte de "masque".
    En effet, écrire un caractère ascii va toujours demander d'écrire une donnée dont la valeur binaire a un bit de poids fort à zéro.

    Exemple:
    - 96 a pour correspondance: 00110100 avec un bit de poids fort à zéro.

    Pour illustrer le "masque", (pas besoin de plus de deux octets dans mon cas) prenons l'exemple de 161:
    - 161 a pour valeur binaire 10100001;
    - Mon masque est: 110xxxxx 10xxxxxx;
    - J'obtiens 11000010 10100001 (premier octet à 194, deuxième à 161)
    - J'utilise le code suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    unsigned char c;
    // Ecriture du premier octet
    c = 194;
    write(1, &c, 1);
    // Ecriture du second
    c = 161;
    write(1, &c, 1);
    Mon caractère est affiché. Cette façon de faire fonctionne. Maintenant, voici mon problème.
    Quand je veux réaliser une fonction qui affiche ces caractère, je n'ai jamais la donnée que je veux en entrée.
    Voici un échantillon de ma fonction:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    void affiche_char(char c)
    {
        unsigned char uc;
        uc = (unsigned char)c;
        if (uc < 128)
            write(1, &c, 1);
        else
        {
            //Affiche le résultat de la conversion expliquée au dessus
        }
    }
    Et le problème, c'est que mon char c en entrée, lorsqu'il n'est pas ascii, prend une valeur que je ne comprends pas (souvent -61) et que je ne peux pas travailler avec cette valeur.
    Quelqu'un aurait-il une solution pour que je récupère la vraie valeur de mon caractère non ascii et que je puisse rentabiliser mes fonctions d'affichage?

    Merci d'avance pour les éventuelles réponses.
    Bon après-midi!

    PS: j'ai vu quelque part une personne qui écrivait: Je ne comprends pas cette déclaration (du moins la définition qui la suit) et n'arrive pas à trouver d'explication en ligne. Si au passage vous pouviez m'éclairer sur ça aussi

  2. #2
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 689
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 689
    Points : 30 983
    Points
    30 983
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par MadiPoupou Voir le message
    Et le problème, c'est que mon char c en entrée, lorsqu'il n'est pas ascii, prend une valeur que je ne comprends pas (souvent -61) et que je ne peux pas travailler avec cette valeur.
    Bonjour

    Il faut faire attention à "ce que tu vois". Parce que ce que tu vois dépend fortement du format d'affichage demandé à printf(). Afficher par exemple un grand nombre via le flag "%d" te donnera à l'écran un nombre négatif (ex printf("%d", 4000000000) donnera -294967296 (le complément à 4294967296 qui est la valeur max d'un unsigned long). Parce qu'avec le flag "int" il considère le premier bit comme un bit de signe alors qu'avec le flag "unsigned int" le premier bit est traité comme faisant partie de la valeur.
    Par ailleurs, pourquoi tu définis ton paramètre comme "char" pour le copier ensuite dans un "unsigned char" ? Autant définir un paramètre "unsigned char" !!!

    Citation Envoyé par MadiPoupou Voir le message
    PS: j'ai vu quelque part une personne qui écrivait: Je ne comprends pas cette déclaration (du moins la définition qui la suit) et n'arrive pas à trouver d'explication en ligne. Si au passage vous pouviez m'éclairer sur ça aussi
    Le préfixe "L" ou "l" indique que le nombre qui le suit doit être vu comme un long (comme si tu avais écrit int c=(long)';';) (oui c'est un peu idiot de caster un truc en long pour le copier ensuite dans un int mais bon, c'est autorisé). Et l'écriture 'c' (avec des quotes simples) représente en fait la valeur ascii du caractère "c" (donc toujours du nombre).
    Si par exemple je veux le rang d'une lettre x dans l'alphabet, ce sera plus clair d'écrire x - 'A' que d'écrire x - 65.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  3. #3
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Note: ton "masque", c'est un encodage du caractère en UTF-8. Ça marchera sur la plupart des systèmes unixoïdes accessibles au grand public de nos jours, mais pour Windows, il faudra repasser. D'un autre côté, write(1,...) ne marche pas sous Windows non plus.

    PS: Les nombres magiques, c'est pas bien. Utilise STDOUT_FILENO à la place du premier 1 dans tes appels à write().
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

Discussions similaires

  1. comment identifier des caractères ascii art ?
    Par blackbird1 dans le forum Bibliothèques et frameworks
    Réponses: 0
    Dernier message: 07/11/2012, 01h32
  2. Trouver des noms de fichiers avec des caractères non ASCII
    Par llaffont dans le forum Shell et commandes GNU
    Réponses: 3
    Dernier message: 16/10/2012, 14h06
  3. Réponses: 3
    Dernier message: 08/02/2008, 19h34
  4. Détecter des caractères non-ASCII
    Par gvdmoort dans le forum Ruby
    Réponses: 2
    Dernier message: 27/01/2008, 13h16
  5. Réponses: 4
    Dernier message: 07/11/2006, 14h02

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