Originariamente inviato da fdoubledd
ma con il C si puo usare unicode?
Sì, anche se il supporto a seconda della piattaforma è più o meno decente (e soprattutto, su Windows si tende ad usare wchar_t/UTF-16, su Linux char/UTF-8).

Esempio:
codice:
#include <wchar.h>
#include <stdio.h>
#include <locale.h>

/* 
 * Definisce un'enumerazione con i tipi di pezzi
 * Nota: l'ordine è importante, è lo stesso con cui compaiono
 * i corrispondenti caratteri Unicode
 */
enum ChessPiecesT
{
    King,
    Queen,
    Rock,
    Bishop,
    Knight,
    Pawn,
};

enum PlayerT
{
    White=0x2654,   /* codice del carattere re bianco */
    Black=0x265a,   /* codice del carattere re nero   */
};

/* Fornisce il carattere per il pezzo desiderato */
inline wchar_t PieceChar(enum PlayerT Player, enum ChessPiecesT Piece)
{
    /* costruisce il codice del carattere corretto sommando al codice del primo pezzo
     * del giocatore l'offset del carattere desiderato */
    return (wchar_t)(Player + Piece);
}

/* Prima riga della scacchiera (per il nero) */
enum ChessPiecesT TopRow[]={Rock, Knight, Bishop, Queen, King, Bishop, Knight, Rock};

/* Stampa la prima riga della scacchiera */
void PrintTopRow(enum PlayerT Player)
{
    int i;
    for(i=0; i<8; i++)
        putwchar(PieceChar(Player, TopRow[Player==Black?i:(7-i)])); /* se ci è stato chiesto per il bianco inverte l'ordine dei pezzi */
    putwchar(L'\n');
}

/* stampa gli otto pedoni */
void PrintPawns(enum PlayerT Player)
{
    wchar_t pawnChar=PieceChar(Player, Pawn);
    int i;
    for(i=0; i<8; i++)
        putwchar(pawnChar);
    putwchar(L'\n');
}

int main()
{
    setlocale(LC_CTYPE, "");
    PrintTopRow(Black);
    PrintPawns(Black);
    fputws(L"\n\n\n\n", stdout);
    PrintPawns(White);
    PrintTopRow(White);
    return 0;
}
(su Linux va, dovrebbe andare anche su Windows)