Unicode

fdoubledd
vorrei sapere come faccio a stampare un carattere unicode in C. grazie

Risposte
apatriarca
Il C non supporta, se non nella versione del 2011 della quale non esistono ancora compilatori compatibili, caratteri Unicode nelle librerie standard. Devi quindi utilizzare librerie specifiche per il tuo sistema/compilatore.

fdoubledd
il mio problema è questo. devo stampare elementi di una scacchiera http://it.wikipedia.org/wiki/Aiuto:Caratteri_speciali. in che modo potrei fare? grazie.ho windows vista il compilatore è mingw

apatriarca
Il mio consiglio è quello di usare una qualche libreria migliore di quelle standard per l'output su console. Se l'applicazione è esclusivamente per Windows puoi ovviamente usare le Win32 API. Se l'applicazione deve essere multipiattaforma, probabilmente dovresti cercare qualche altra libreria che sia multipiattaforma (o crearne una tu che utilizzi per ogni piattaforma l'API di sistema appropriata).

nessuno.nobody
Potresti fare una cosa brutta...
Chiamata a setlocale, impostazione del locale per la console che sia utf-8 e uso di wchar_t.

apatriarca
UTF-8 utilizza un numero di byte variabile, da 1 a 4 byte per un singolo carattere se non sbaglio, e non ha molto senso usare un array di wchar_t per contenere tali caratteri. Nel caso di stringhe di soli caratteri rappresentabili con la codifica ASCII infatti, la stringa in UTF-8 è del tutto uguale alla stessa stringa in ASCII. Per rappresentare stringhe in UTF-8 in C si utilizzano pertanto normalmente array di (unsigned) char.

Per quanto riguarda setlocale invece, non è detto che sia supportata la codifica UTF-8 per le stringhe. Nella documentazione di setlocale nella libreria della Microsoft c'è scritto ad esempio (per quella contenuta in Visual Studio 2012):

The set of available languages, country/region codes, and code pages includes all those supported by the Win32 NLS API except code pages that require more than two bytes per character, such as UTF-7 and UTF-8. If you provide a code page like UTF-7 or UTF-8, setlocale will fail, returning NULL. The set of language and country/region codes supported by setlocale is listed in Language and Country/Region Strings.

Su altri sistemi è possibile (molto probabile) che funzioni. Anche se si può certamente cercare di far funzionare tale soluzione in modo relativamente portabile, ritengo che l'uso di librerie alternative sia in generale preferibile. Il supporto nativo alle diverse codifiche è comunque qualcosa che lascia molto a desiderare.

nessuno.nobody
Concordo pienamente con quanto detto da te.
L'uso di librerie alternative che offrono un supporto totale all'unicode è la scelta migliore. Io stesso usai una libreria fatta dall'IBM (se non erro), per poter gestire in maniera un progetto che faceva uso massiccio di output su console di alfabeto cirillico xD

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.