2010-01-19 41 views
5

Sto sviluppando un gioco di carte e vorrei stampare il simbolo per cuori, quadri, picche e fiori. La mia piattaforma di destinazione sarà Linux.C++: Stampa di cuore ASCII e diamanti con piattaforma indipendente

In Windows, so come stampare questi simboli. Ad esempio, per stampare un cuore (in ASCII) ho scritto ...

// in Windows, print a ASCII Heart 

#include <iostream> 

using std::cout; 
using std::endl; 

int main() 
{ 
char foo = '\3'; 
cout << heart << endl; 
system ("PAUSE"); 
return 0; 
} 

Tuttavia, come ho accennato, un simbolo del cuore, non verrà stampato in Linux. Esiste una libreria standard che può essere utilizzata per stampare un simbolo per cuori, quadri, spade e mazze in Linux e Windows? Quello che ho cercato fino ad ora è guardare Unicode poiché è la mia comprensione che questo è universale.

Grazie per l'assistenza fornita.

+0

Il codice viene compilato? – Lazer

risposta

12

Se vuoi un modo portatile, allora si dovrebbe utilizzare i punti di codice Unicode (che hanno definito glifi associati ad essi):

♠ U+2660 Black Spade Suit 
♡ U+2661 White Heart Suit 
♢ U+2662 White Diamond Suit 
♣ U+2663 Black Club Suit 
♤ U+2664 White Spade Suit 
♥ U+2665 Black Heart Suit 
♦ U+2666 Black Diamond Suit 
♧ U+2667 White Club Suit 

Ricordate che tutto sotto il carattere 32 in ASCII è un personaggio di controllo . Hanno un significato associato a loro e non si ha la certezza di ottenere un glifo o un comportamento (anche se la maggior parte dei personaggi di controllo ha i glifi, sebbene non siano mai stati concepiti per essere stampabili). Tuttavia, non è una scommessa sicura.

Tuttavia, l'utilizzo di Unicode richiede il supporto corretto di caratteri e codifica che può o non può essere un problema su Mi piace di UNIX.

Su Windows almeno alcuni dei suddetti punti di codice si associano ai glifi del carattere di controllo ASCII che si stanno visualizzando se la console è impostata su caratteri raster (e quindi non supporta Unicode o qualsiasi altra cosa rispetto alla pagina di codice OEM correntemente impostata) . Questo si applica solo alle varianti nere poiché quelle bianche non hanno equivalenti.

+11

"♠ U + 2660 Black Space Suit" è uno degli errori più divertenti che ho visto da un po '. –

+0

@Jerry: [urgh, odio che @], risolto :-). Sto esaurendo la caffeina, penso :-). E digito "space" più spesso di "spade", quindi le mie dita sono andate avanti senza consultarmi con gli occhi se è corretto :-) – Joey

+0

Rössel: Come hai 'scritto' i simboli nella tua risposta ?? – Lazer

1

Non è una questione della libreria, è una questione della codepage del font che stai utilizzando.

Se il font utilizzato per il terminale è in esecuzione su non ha cuore e diamanti nella sua attuale tabella codici, nessuna libreria ti aiuterà - dovresti usare la grafica.

Per ulteriori letture, proverei a trovarlo forse in Unicode Tables - tuttavia, i terminali unicode sono rari ... E anche se si dispone di un font Unicode, non c'è alcuna garanzia che avrà le immagini delle schede in esso.

Bottom line: tutto dipende dal tipo di carattere, e non c'è un modo sicuro garantito per raggiungerlo senza supplire i propri gelfi.

+0

Questa è la prima volta che ascolto la 'Code page'. Ora vado a leggere su questo. Molte grazie. – different

+0

La tabella codici non viene riprodotta. La maggior parte delle code page lascia intatto ASCII nei primi 128 caratteri e ridefinisce i caratteri solo al di sopra di quello. Inoltre, non si deve presumere che i caratteri di controllo siano comunque stampabili. – Joey

+1

Unicode * è * un modo portabile per raggiungere questo - su sistemi che supportano almeno Unicode (conosci i sistemi operativi che non lo fanno?). È possibile produrre in modo specifico un personaggio che rappresenta un cuore. Il supporto degli glifi nei caratteri potrebbe rovinare questo, ma ciò non influisce sul fatto che sia uscito un cuore. Tuttavia, quando si usano caratteri di controllo come l'OP, non si ha assolutamente alcuna garanzia o portabilità. – Joey

8

Su Linux, è quasi sempre possibile scrivere UTF-8 su stdout e i caratteri Unicode verranno visualizzati splendidamente.

#include <iostream> 

const char heart[] = "\xe2\x99\xa5"; 

int main() { 
    std::cout << heart << '\n'; 
    return 0; 
} 

Potete trovare UTF-8 codifiche di caratteri Unicode su siti come fileformat.info (cercare quella pagina per "UTF-8 (hex)").

Un altro modo è utilizzare caratteri ampi. Per prima cosa è necessario chiamare setlocale per impostare le cose. Quindi utilizzare solo wchar_t anziché char e wcout anziché cout.

#include <iostream> 
#include <clocale> 

const wchar_t heart[] = L"\u2665"; 

int main() { 
    setlocale(LC_ALL, ""); 
    std::wcout << heart << L'\n'; 
    return 0; 
} 
+0

Qualcuno degli esperti ha problemi con questo? Penso che potrei trovarlo utile in futuro. –

+0

'setlocale' +' wcout' è sicuramente la cosa più normale da fare. Il principale fastidio è che, a parte la libreria standard, le librerie tendono a voler passare le stringhe 'char', non' wchar_t'.Quindi devi scrivere le funzioni per convertire avanti e indietro, e devi chiamarle come appropriato. Finisce per sentirsi un po 'burocratico. : - \ –

+0

+1: questa è una risposta molto più ampia di quella accettata –

1

La risposta in alto non è più aggiornata o non è corretta.

I codici ASCII per club, quadri, cuori, picche sono ora '\5', '\4', '\3', '\6' rispettivamente.

Problemi correlati