2009-09-14 3 views

Odpowiedz

9

Dla UTF8 masz wygenerować kodowania samodzielnie za pomocą reguł znaleziono, na przykład here. Na przykład niemiecki ostry s (ß, punkt kodowy 0xdf) ma kodowanie UTF8 0xc3,0x9f. Twój e-ostry (é, kod punktu 0xe9) ma kodowanie UTF8 o wartości 0xc3,0xa9.

I można umieścić dowolne znaki szesnastkowe w struny z:

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

Notacja \ xHEX jest tym, czego szukałem, dzięki. –

+0

Jeśli zmienna jest wystarczająco szeroka, aby pomieścić kodowanie UTF-16, czy możesz powiedzieć \ x00e9? –

1
+0

Wystarczy pamiętać, że to * UNIX * Spec (SUS), nie jest częścią ISO C I tylko przynieść go ponieważ nie było żadnego tagu unix na pytanie. – paxdiablo

+0

Jestem bardziej zainteresowany jak renderować é w tekście ASCII w C, w Perlu mogę to zrobić, wypowiadając '" \ x {e9} "'. Problem polega na tym, że źródło znajduje się w ASCII, ale musi tworzyć znaki UTF-8. –

+0

@Chas: Dlaczego nie używać kodowania UTF-8 jako kodu źródłowego? Większość kompilatorów nie powinna mieć z tym żadnego problemu, o ile sekwencje wielobajtowe występują tylko wewnątrz literałów łańcuchowych ... – Christoph

5

Jeśli masz kompilatora C99 można użyć <wchar.h> (i <locale.h>) i wpisz kod Unicode wskazuje bezpośrednio w źródle.

$ 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

Chociaż powyższy kod działa, należy nadmienić, że 'wchar_t' nie jest w stanie reprezentować wielu lokalizacji jednocześnie. Musi tylko być wystarczająco szeroki, aby obsługiwać bieżące ustawienia regionalne. –