2009-04-24 2 views
10

Sto cercando di cose di output come 안, 蠀, ☃ da Cunicode ciao mondo per C?

#include <wchar.h> 
int main() 
{ 
    fwprintf(stdout, L"안, 蠀, ☃\n"); 
    return 0; 
} 

uscita è?,?,?

Come si stampano quei caratteri?

Edit:

#include <wchar.h> 
#include <locale.h> 
int main() 
{ 
    setlocale(LC_CTYPE, ""); 
    fwprintf(stdout, L"안, 蠀, ☃\n"); 
    return 0; 
} 

questo ha fatto il trucco. l'uscita è 안, 蠀, ☃. tranne che il carattere cinese e il pupazzo di neve appaiono come una scatola nel mio urxvt probabilmente perché non ho abilitato quelle impostazioni locali.

$ locale -a 
C 
en_US 
en_US.iso88591 
en_US.iso885915 
en_US.utf8 
ja_JP.utf8 
ko_KR 
ko_KR.euckr 
ko_KR.utf8 
korean 
korean.euc 
POSIX 
zh_CN.utf8 

quale locale devo abilitare in aggiunta affinché visualizzi carattere cinese e pupazzo di neve? forse ho bisogno di font?

il programma di cui sopra funziona su Windows?

+0

Stai utilizzando Windows o Linux? – Zifre

+0

dannazione, c'è qualcosa che non va nel mio computer perché vedo anche quelli? nel codice di esempio! – alvatar

+4

Prova a impostare la codifica su Unicode (UTF-8) (in Firefox, Visualizza-> Codifica caratteri) –

risposta

1

Devi configurare il tuo sistema per accettare quei caratteri. Cosa stai usando? Windows, Linux?

+0

sto usando linux. $ locale tutto impostato su en_US.utf8 – numeric

9

è necessario impostare il terminale di uscita come Unicode compatibili.

Su Linux (con shell Bash), provare:

$ LANG=en.UTF-8 

e anche fare in modo che il vostro emulatore di terminale può effettivamente visualizzare Unicode ed è configurato per farlo.

4

Il wchar_t C è definito come:

Tipo wchar_t è un tipo distinto i cui valori possono rappresentare codici distinti per tutti i membri della grande set di caratteri esteso specificato tra i locale supportati (22.1.1). [...]

La differenza tra i caratteri multibyte e wchar_t:

caratteri multibyte possono richiedere più di un byte per un dato carattere a seconda della codifica (es: UTF-8, UTF- 16)

che

wchar_t ha una dimensione fissa, cioè siz eof (wchar_t) che è definito dall'implementazione. Nota che questa larghezza definisce quale codifica (i) può supportare il tuo wchar_t. Quindi, se sizeof(wchar_t) == 2 non è possibile utilizzare la codifica UTF-32.

Ricorda inoltre che lo wchar_t non ha il senso della codifica da solo. Dovresti prima dire al compilatore che tipo di codifica deve usare per i dati wchar_t. L'output errato è probabilmente dovuto al fatto che i caratteri vengono trattati nella codifica predefinita che non supporta correttamente quei caratteri e una corrispondenza fallita porta a uno stile 'notdef'? ' produzione.

+0

wchar_t non è necessariamente multibyte - può essere lungo un byte. –

+0

Beh sì, avrei dovuto essere più pedante :-) – dirkgently

6

Ci sono molte fasi individuali nel processo di ricezione dell'output Unicode - che devono essere tutte correttamente configurate.

In primo luogo, si sta compilando con supporto Unicode abilitato? sarà necessario farlo in Windows (-D UNICODE -D __UNICODE).

In secondo luogo, stai emettendo su una riga di comando che supporta l'unicode, sia in linea di principio, ma anche con un font contenente i glifi dei caratteri che stai emettendo?

In terzo luogo, le codifiche Unicode utilizzate dal compilatore e dalla riga di comando corrispondono? è inutile avere UCS2 nel tuo binario quando la tua linea di comando prevede UTF8.

Fondamentalmente è necessario comprendere veramente Unicode e le sue codifiche, per farlo correttamente. Non immagini che sia diretto o che non hai bisogno di imparare tutti i concetti sottostanti; questa roba non funziona per caso perché ci sono troppe cose che devono essere esattamente corrette.

0

Proprio come suggerito da Alnitak, si deve specificare un locale con un set di caratteri/codifica che includa i caratteri che si desidera mostrare. (Unicode /) UTF-8 dovrebbe coprire tutti i caratteri Unicode.

Il terminale deve utilizzare un carattere con rispettivi glifi.

Windows 'CMD.EXE è notoriamente debole quando si tratta di set di caratteri oltre gli 8 bit. Forse, avresti bisogno di un pannello della GUI invece di affidarti allo stdout.