Stampe simboli C++

Pubblicità

CancaroJ

Nuovo Utente
Messaggi
2
Reazioni
0
Punteggio
22
Salve a tutti. Mi chiedevo: è possibile fare stampe di simboli "particolari" in C++ non presenti nella tabella ascii, come per esempio il simbolo dell'euro oppure il simbolo di spunta (✓)?
 
Cosa intendi per “particolari” ?

Ti consiglio di dare un'occhiata allo standard ASCII, alle CodePage a Unicode ed ai suoi formati di trasformazione
Temo di avere posto male la mia domanda. Come posso stampare caratteri particolari presenti nella tabella ascii (quali ♠ oppure ☺, corrispondenti rispettivamente al numero 6 e 1 in ASCII) in c++? Provandoci, ho notato che non tutti i simboli vengono stampati correttamente (alcuni di essi vengono sostituiti da un punto interrogativo nella stampa).
 
Temo di avere posto male la mia domanda. Come posso stampare caratteri particolari presenti nella tabella ascii (quali ♠ oppure ☺, corrispondenti rispettivamente al numero 6 e 1 in ASCII) in c++? Provandoci, ho notato che non tutti i simboli vengono stampati correttamente (alcuni di essi vengono sostituiti da un punto interrogativo nella stampa).

Questo accade perché la tabella ASCII (intendiamo la 7 bit standard, più la parte data dall'ottavo bit, ovvero quella estesa) non è composta interamente di caratteri stampabili:

asciifull.gif

come puoi vedere i valori compresi tra 0x00 e 0x20 (escluso) – ovvero i primi 32 caratteri – sono caratteri non propriamente stampabili. Andando ancora più nel dettaglio, sono caratteri di controllo, ovvero caratteri che originariamente non dovevano servire a rappresentare il testo, ma a pilotare una stampante. Con il tempo i caratteri di controllo sono stati usati nei modi più disparati, quasi mai per il loro scopo (fonte)

Quello che puoi fare è saltare i caratteri di controllo e fare qualcosa del tipo

Codice:
for (char i = 0x20; i < 0xFF; ++i)
{
  my_print_function(i);
}

o se vuoi una soluzione più elegante, fare una tabella statica contenente stringhe in cui puoi accedere con un intero ed uscire con una stringa. questo ti permetterebbe di dire che ad esempio nella posizione 0x04 c'è il carattere di controllo "end of transmission":


Codice:
std::string asciiTable[0xFF] = {
  "CC: (NUL)", // 0x00
  "CC: (SOH)", // 0x01
  "CC: (STX)", // 0x02
  "CC: (ETX)", // 0x03
  "CC: (EOT)", // 0x04
  …
  "a", // 0x61 -> 97
  "b", // 0x62 -> 98
  …
};

in questo modo puoi accedere alla tabella come segue:

Codice:
for (char i = 0; i < 0xFF; ++i)
{
  std::string& ascii_value = asciiTable[i];
  my_print_function(ascii_value);
}

quello che cambia principalmente è che nel primo modo stampi tutti i caratteri che sono davvero stampabili, mentre nel secondo modo accedi ad una tua struttura che mappa per ogni carattere ascii una stringa contenente la descrizione di quel carattere.

il carattere ascii non è detto che produrrà i simboli “♠” o “☺”
questo perché il font che usi per stampare dovrebbe anche lui essere di tipo ascii esteso e non dovrebbe contemplare invece eventuali codepage.

Per questo argomento ti rimando al link sulle codepage che ti ho segnalato più in alto.

Se vuoi invece stampare un determinato simbolo della mappa unicode, puoi cercare il codepoint del carattere nella mappa e scrivere qualcosa del genere:

Codice:
wchar_t spades_symbol = 0x2660;[/COLOR]
[COLOR=#333333]my_wide_print_function([/COLOR][COLOR=#333333]spades_symbol[/COLOR][COLOR=#333333]);
[/COLOR]


dove 0x2660 = simbolo delle picche -> Unicode Character 'BLACK SPADE SUIT' (U+2660)
 
Ultima modifica:
Pubblicità
Pubblicità
Indietro
Top