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 :

[Mode protégé] Ecrire une chaîne de caractères dans la RAM Video, problème avec "é"


Sujet :

C

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 8
    Points : 8
    Points
    8
    Par défaut [Mode protégé] Ecrire une chaîne de caractères dans la RAM Video, problème avec "é"
    Bonjour à tous !
    Dans mon minikernel en mode protégé, j'ai actuellement une fonction print(char *string) comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    void print(char *string)
    {
    	while(*string != 0)
    		{
    			putcar(*string);
    			string++;
    		}
    }
    Quand j'appelle cette fonction : la chaine passée en paramètre ("Machaine" par ex) est stockée en mémoire, où le code ASCII de chaque caractère est stocké en mémoire sous forme de char.
    Or, quand j'introduis un "é" dans ma chaine, il est transformé en deux caractères impossibles à écrire. Ainsi, le code ASCII du "é" tel qu'il serait décrypté serait trop long pour un char et donc "déborderait" sur un autre...
    Or le code ASCII d'un 'é' est 130, et quand je demande putcar(130),
    cela écrit bien un "é".
    Ce serait donc la conversion de la chaine qui donnerait un mauvais code ASCII...

    Quelqu'un connaîtrait-il le mauvais code ASCII stocké en mémoire, ou comment résoudre ce problème ?

    Merci d'avance

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 395
    Points : 23 757
    Points
    23 757
    Par défaut
    Citation Envoyé par Armael Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    void print(char *string)
    {
    	while(*string != 0)
    		{
    			putcar(*string);
    			string++;
    		}
    }
    Or, quand j'introduis un "é" dans ma chaine, il est transformé en deux caractères impossibles à écrire. Ainsi, le code ASCII du "é" tel qu'il serait décrypté serait trop long pour un char et donc "déborderait" sur un autre...
    Or le code ASCII d'un 'é' est 130, et quand je demande putcar(130),
    cela écrit bien un "é".
    Ce serait donc la conversion de la chaine qui donnerait un mauvais code ASCII...

    Quelqu'un connaîtrait-il le mauvais code ASCII stocké en mémoire, ou comment résoudre ce problème ?

    Merci d'avance
    Bonjour,

    - Ce code devrait se trouver dans le forum « C » et pas « Assembleur » ;

    - Il n'y a pas de caractères accentués dans le code ASCII. Celui est codé sur 7 bits et ne concerne donc que les caractères de 0 à 127 (et même dedans, on trouve des variations selon les implémentations). Tous les caractères suivants (de 128 à 255) concernent des extensions et dépendent de la page de code que tu utilises ;

    - Il se trouve que sur PC en particulier, le jeu de caractères par défaut de la carte vidéo est la page de code 437, dans laquelle le caractère numéro 130 est effectivement un « é ». Sur les PC européens, ce jeu de caractère était souvent remplacé au démarrage par la page 850, qui sacrifiait des caractères (les coins des bordures, généralement) pour ajouter des lettres accentuées, en conservant les existantes. Donc, on y trouve également un « é » à la position 130, mais c'est loin d'être une norme. En ISO-8859-1, soit le jeu de caractères occidentaux qui fait réellement foi aujourd'hui (hors UTF, bien sûr), le « é » est la position 233 ;

    - La chaîne de caractère que tu transmets est passée telle que tu l'as saisie dans ton code source, et est par conséquent dépendante du jeu de caractères que tu utilise ton éditeur de texte, et il y a de très fortes chances pour que celui-ci travaille en UTF-8, d'où les deux caractères pour coder ton « é ».

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 8
    Points : 8
    Points
    8
    Par défaut
    OK, merci beaucoup,
    désolé pour l'emplacement du post, je n'avais pas bien lu, je croyais que c'etait une section dveloppement d'OS indépendante et pas une sous partie du forum assembleur...
    Dois-je mettre mon éditeur en iso-8859 ?
    Merci

  4. #4
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 395
    Points : 23 757
    Points
    23 757
    Par défaut
    Citation Envoyé par Armael Voir le message
    OK, merci beaucoup,
    désolé pour l'emplacement du post, je n'avais pas bien lu, je croyais que c'etait une section dveloppement d'OS indépendante et pas une sous partie du forum assembleur...
    Dois-je mettre mon éditeur en iso-8859 ?
    Merci
    Tu auras effectivement moins d'ennuis car il s'agit d'une page de 256 codes sur un seul octet chacun. Donc, il est très facile de faire les bitmaps associés pour ta carte graphique. GNU/Linux, par exemple, en propose un certain nombre par défaut.

    Cela dit, tout dépendra bien sûr du moment où tu lanceras ton programme et de la plate-forme que tu utilises. Si c'est au démarrage d'un PC, ce sera, par définition, la page de code 437. L'ISO-8859 ne t'apportera donc rien. Donc, il vaut mieux que tu mettes toutes tes chaînes dans un fichier distinct. Ensuite, soit ton éditeur est capable de gérer directement le CP 437, et tu l'appliques sur ce fichier précis, soit tu utilises un convertisseur (iconv ou recode, par exemple, sur les unixoïdes) au moment de la compilation pour générer en live une version CP437 de ton fichier prêt à être lié au moment de la compilation.

  5. #5
    Membre chevronné
    Avatar de Forthman
    Homme Profil pro
    conception mécanique
    Inscrit en
    Janvier 2005
    Messages
    702
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : conception mécanique
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2005
    Messages : 702
    Points : 1 905
    Points
    1 905
    Par défaut
    Ou alors tu n'utilises pas les accents

    Blague à part, je me suis mis a utiliser les accents depuis peu car jusqu'à il y
    a pas si longtemps, j'utilisais encore des programmes DOS sous XP, et c'était la
    misère avec les accents ...

    a+ François

Discussions similaires

  1. [MySQL] Remplacer une chaîne de caractères dans une base de données
    Par Furius dans le forum PHP & Base de données
    Réponses: 10
    Dernier message: 27/11/2013, 21h06
  2. Rechercher une chaîne de caractère dans une série de fichier
    Par Edoxituz dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 28/02/2006, 12h51
  3. Réponses: 7
    Dernier message: 14/12/2005, 09h53
  4. Remplacer une chaîne de caractères dans une base
    Par Furius dans le forum Requêtes
    Réponses: 4
    Dernier message: 19/10/2005, 23h03
  5. Réponses: 3
    Dernier message: 09/05/2002, 01h39

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