2009-09-14 8 views

risposta

9

Per UTF8, è necessario generare la codifica da soli, usando le regole trovate, ad esempio, here. Ad esempio, il tedesco sharp s (ß, punto di codice 0xdf), ha la codifica UTF8 0xc3,0x9f. Il tuo e-acute (é, code point 0xe9) ha una codifica UTF8 di 0xc3,0xa9.

E si può mettere caratteri esadecimali arbitrari nelle stringhe con:

char *cv = "r\xc3\xa9sum\xc3\xa9"; 
char *sharpS = "\xc3\x9f"; 
+0

La notazione \ xHEX è ciò che stavo cercando, grazie. –

+0

Se la variabile è sufficientemente ampia da contenere UTF-16, puoi dire \ x00e9? –

1

wchar_t è il tipo che si sta cercando: http://opengroup.org/onlinepubs/007908799/xsh/wchar.h.html

+0

Basta tenere a mente che questo è un * UNIX * spec (SUS), non fa parte di ISO C. Ho solo tirarlo su poiché non c'era un tag unix sulla domanda. – paxdiablo

+0

Sono più interessato a come eseguire il rendering in testo ASCII in C, in Perl posso farlo dicendo "" \ x {e9} "'. Il problema è che la fonte è in ASCII, ma è necessario creare caratteri UTF-8. –

+0

@Chas: Perché non utilizzare un UTF-8 come codifica del file sorgente? La maggior parte dei compilatori non dovrebbe avere alcun problema finché le sequenze multibyte si verificano solo all'interno di stringhe letterali ... – Christoph

5

Se si dispone di un compilatore C99 è possibile utilizzare <wchar.h> (e <locale.h>) e immettere il codice Unicode punta direttamente nella fonte.

$ cat wc.c

#include <locale.h> 
#include <stdio.h> 
#include <wchar.h> 

int main(void) { 
    const wchar_t *name = L"r\u00e9sum\u00e9"; 
    setlocale(LC_CTYPE, "en_US.UTF-8"); 
    wprintf(L"name is %ls\n", name); 
    return 0; 
} 

$ /usr/bin/gcc -std=c99 -pedantic -Wall wc.c

$ ./a.out

name is résumé 
+0

Mentre il codice sopra riportato funziona, è fondamentale menzionare che 'wchar_t' non è necessariamente in grado di rappresentare più locali contemporaneamente. Deve essere abbastanza ampio da supportare le impostazioni locali correnti. –

Problemi correlati