Tipo Carattere in Object Pascal

Concetti Chiave
  • In Object Pascal, il tipo Char rappresenta singoli caratteri Unicode a doppio byte.
  • I caratteri possono essere rappresentati in notazione simbolica (apici singoli) o numerica (preceduti da #).
  • Le funzioni Chr e Ord permettono di convertire tra caratteri e i loro code point Unicode.
  • Il tipo Char è un tipo ordinale, consentendo l'uso di funzioni come Inc e Dec, e cicli for con contatori di tipo Char.
  • Le operazioni comuni sul tipo Char includono funzioni come IsLetter, IsDigit, IsWhiteSpace, ToUpper e ToLower.

Caratteri in Object Pascal

Le variabili carattere sono definite utilizzando il tipo Char.

Un'importante caratteristica del tipo Char è che rappresenta caratteri Unicode a doppio byte (rappresentati anche dal tipo WideChar). Le vecchie versioni di Delphi e Object Pascal utilizzavano il tipo AnsiChar per rappresentare caratteri a singolo byte, ma oggi si consiglia di utilizzare Char o WideChar per garantire la compatibilità con i caratteri Unicode.

Studieremo in dettaglio i caratteri in Unicode nelle lezioni sulle stringhe. Per ora, è sufficiente sapere che il tipo Char rappresenta un singolo carattere Unicode, che può essere una lettera, una cifra, un simbolo o un carattere di controllo.

Un carattere costante, o carattere letterale, può essere rappresentato in due modi:

  • con la notazione simbolica:

    In altre parole, racchiudendo il carattere tra apici singoli, come ad esempio:

    'a'
    'b'
    '1'
    '#'
    '$'
    ' '
    
  • con la notazione numerica:

    In questo caso, si utilizza il simbolo # seguito dal numero intero che rappresenta il carattere. Ad esempio, il carattere 'N' può essere rappresentato come #78, poiché 78 è il code point Unicode per la lettera maiuscola 'N'.

La notazione numerica può anche essere espressa utilizzando la funzione di sistema Chr. La funzione Chr accetta un numero intero come argomento e restituisce il carattere corrispondente. Ad esempio, Chr(78) restituirà il carattere 'N'.

La conversione opposta può essere fatta con la funzione Ord. Questa funzione accetta un carattere come argomento e restituisce il suo valore numerico (code point Unicode). Ad esempio, Ord('N') restituirà 78.

Quando ci si riferisce a caratteri speciali, come i caratteri di controllo dello standard ASCII, si utilizzerà generalmente la notazione numerica.

La seguente lista include alcuni dei caratteri speciali più comunemente utilizzati:

  • #8 backspace
  • #9 tab
  • #10 nuova riga
  • #13 carriage return
  • #32 spazio
  • #27 escape

Operazioni sul Tipo Carattere

Come altri tipi ordinali, il tipo Char ha diverse operazioni predefinite che si possono applicare a variabili di questo tipo.

Per poter utilizzare queste funzionalità è necessario abilitarle riferendosi all'unità Character in un'istruzione uses.

Le funzioni più comuni messe a disposizione per il tipo Char sono:

  • IsLetter: restituisce True se il carattere è una lettera (maiuscola o minuscola).
  • IsDigit: restituisce True se il carattere è una cifra (0-9).
  • IsWhiteSpace: restituisce True se il carattere è uno spazio bianco (spazio, tab, nuova riga, ecc.).
  • ToUpper: converte il carattere in maiuscolo.
  • ToLower: converte il carattere in minuscolo.

Proviamo queste funzioni in un semplice programma:

program EsempioChar;

uses
    Character;
var
    Ch: Char;
begin
    Write('Inserisci un carattere: ');
    ReadLn(Ch);

    if IsLetter(Ch) then
        WriteLn(Ch, ' è una lettera.')
    else if IsDigit(Ch) then
        WriteLn(Ch, ' è una cifra.')
    else if IsWhiteSpace(Ch) then
        WriteLn('Hai inserito uno spazio bianco.')
    else
        WriteLn(Ch, ' non è né una lettera né una cifra.');

    WriteLn('Maiuscolo: ', ToUpper(Ch));
    WriteLn('Minuscolo: ', ToLower(Ch));
end.

Un possibile output di questo programma potrebbe essere:

Inserisci un carattere: a
a è una lettera.
Maiuscolo: A
Minuscolo: a

Char come Tipo Ordinale

Il tipo di dati Char è un tipo ordinale, quindi si possono utilizzare le funzioni Inc e Dec su di esso (per ottenere il carattere successivo o precedente o spostarsi avanti di un numero dato di elementi, come abbiamo visto nella lezione sui tipi interi) e scrivere cicli for con un contatore Char.

Per chiarire questo concetto, consideriamo un programma di esempio in cui, partendo dal carattere A, si stampano tutti i caratteri maiuscoli dell'alfabeto:

program EsempioCharFor;

uses
    Character;
var
    Ch: Char;
begin
    for Ch := 'A' to 'Z' do
        Write(Ch, ' ');
    WriteLn;
end.

Il risultato di questo programma sarà:

A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 

Studieremo in dettaglio il ciclo for nelle prossime lezioni sulle strutture di controllo.