Enrere Mòdul 1
Fonaments de Programació. Llenguatge C/C++---
Pràctica    Resum teòric Exercicis

 

Els accents

El sistema operatiu Windows fa servir el joc de caràcters ANSI, en canvi, l'MS DOS utilitza el codi ASCII. El fet d'utilitzar un editor de Windows, com és el Visual C++, per crear aplicacions de consola fa que els caràcters especials, com la lletra 'ç', o la lletra 'ñ', o les vocals accentuades no es visualitzin bé a la pantalla. Per evitar això hi ha diverses possibilitats,  en aquesta pràctica veurem dues d'aquestes possibilitats.

 

Desenvolupament de la pràctica

Feu el mateix que heu fet a la pràctica 1 i pràctica 2 per tal d'obrir un nou projecte anomenat m1p03. En aquest cas escriviu a la finestra de text el següent codi:

//m1p03.cpp: converteix de ANSI a ASCII i viceversa

#include <stdio.h>
#include
<windows.h>

void main() {

    char n[60]="áéíóúàèìòù";

    printf("Aix\x095 \x082s una prova\n");
    printf("%s\n",n); //n està en ANSI

    CharToOem(n,n);
    printf("%s\n",n); //ara n està en ASCII

    OemToChar(n,n);
    printf("%s\n",n); //es torna a posar en ANSI

}

Explicació del programa

La primera forma, i la més ràpida, en el cas que la cadena de caràcters no tingui massa caràcters especials, és fer servir les seqüències d'escapament dels caràcters ASCII, per exemple, la línia:

printf("Aix\x095 \x082s una prova");

farà que s'imprimeixi:

Això és una prova

ja que \x095 és el codi ASCII en hexagesimal[1] del caràcter 'ò' i \x082 és el codi ASCII en hexagesimal del caràcter 'é'.

Els codis  ASCII dels caràcters especials usuals són:

á \x0A0 é \x082 í \x0A1 ó \x0A2 ú \x0A3
Á \x0B5 É \x090 Í \x0D6 Ó \x0E0 Ú \x0E9
à \x085 è \x08A ï \x08B ò \x095 ü \x081
À \x0B7 È \x0D4 Ï \x0D8 Ò \x0E3 Ü \x09A
ç \x087 Ç \x080 ñ \x0A4 Ñ \x0A5 ¿ \x0A8
¡ \x0AD

Una altra possibilitat és fer servir la funció CharToOem(), la declaració de la qual està a l'arxiu capçalera windows.h. Aquesta funció permet convertir una cadena ANSI a ASCII. La funció OemToChar() fa justament el contrari.

Les tres funcions printf() que hi han després fan que s'escrigui el següent:

ßúݾ·óþý=¨

áéíóúàèìòù

ßúݾ·óþý=¨

Es pot veure que la primera línia no és el que hem escrit a l'editor, és l'equivalent ASCII dels codis ANSI que hem teclejat a l'editor Visual C++. La segona línia és el resultat de la funció CharToOem(). Es pot veure a la tercera línia com la funció OemToChar() fa justament el contrari que la funció CharToOem(). 

Deixarem la següent pràctica també com exemple de què s'ha de fer per tal que surtin bé els accents per pantalla, però, a partir de llavors, per facilitar la lectura del curs només es marcarà de color vermell els caràcters especials que s'han de reemplaçar pel seu corresponent codi ASCII.

 


Aclariments

hexagesimal vol dir expressat en base 16. Aquesta és una base de numeració molt utilitzada en programació pel fet que 16 és una potència de 2.