Multibyte Chars mit glibc
-
Hallo,
ich versuche, die locale-abhängigen Zeichensatzfunktionen der GNU C Library zu verstehen. Ich habe etwas in der glibc-Doku gestöbert und herumprobiert, bekomme aber nicht die erwarteten Ergebnisse. Was läuft da falsch?
Danke!
// testmb.c #include <stdlib.h> // MB_CUR_MAX #include <stdio.h> // printf() #include <limits.h> // MB_LEN_MAX #include <wchar.h> // mbrtowc() int main(int argc, char* argv[]) { // erwartetes Ergebnis für MB_CUR_MAX: // bei LC_TYPE=de_DE (= ISO 8859-1): 1 // bei LC_TYPE=de_DE.UTF-8: 4 printf("MB_LEN_MAX: %d\nMB_CUR_MAX: %d\n", MB_LEN_MAX, MB_CUR_MAX); wchar_t* result = malloc(sizeof(wchar_t)); size_t erg; // äöüß in ISO 8859-1 const char data1[] = {0xe4, 0xf6, 0xfc, 0xdf, 0x00}; printf("%s\n", data1); // Ausgabe hängt von Einstellung des Terminals/XTerm ab erg = mbrtowc(result, data1, (size_t) 1, NULL); // Rückgabewert von mbrtowc(): // -2: unvollständiges Multibytezeichen // -1: ungültige Bytefolge // 0: Zeichen ist NULL // > 0: Anzahl verwertete Zeichen // erwartetes Ergebnis: // bei LC_TYPE=de_DE: 1 (ä = 1 Byte) // bei LC_TYPE=de_DE.UTF-8: -2 (0xe4 = 1110 0100 = Startbyte 3-Byte-Zeichen) printf ("mbrtowc(0xe4): %d\n", erg); // äöüß in UTF-8 const char data2[] = {0xc3, 0xa4, 0xc3, 0xb6, 0xc3, 0xbc, 0xc3, 0x9f, 0x00}; printf("%s\n", data2); // Ausgabe hängt von Einstellung des Terminals/XTerm ab erg = mbrtowc(result, data2, (size_t) 2, NULL); // erwartetes Ergebnis: // bei LC_TYPE=de_DE: 1 (0xc3 = A mit Tilde) // bei LC_TYPE=de_DE.UTF-8: 2 (ä = 2 Bytes) printf ("mbrtowc(0xc3 0xa4): %d\n", erg); return 0; }
emily@Cervelat:~$ gcc -Wall -o testmb testmb.c emily@Cervelat:~$ locale LANG=de_DE.UTF-8 LANGUAGE=de_DE:de:en_GB:en LC_CTYPE="de_DE.UTF-8" LC_NUMERIC="de_DE.UTF-8" LC_TIME="de_DE.UTF-8" LC_COLLATE="de_DE.UTF-8" LC_MONETARY="de_DE.UTF-8" LC_MESSAGES="de_DE.UTF-8" LC_PAPER="de_DE.UTF-8" LC_NAME="de_DE.UTF-8" LC_ADDRESS="de_DE.UTF-8" LC_TELEPHONE="de_DE.UTF-8" LC_MEASUREMENT="de_DE.UTF-8" LC_IDENTIFICATION="de_DE.UTF-8" LC_ALL= emily@Cervelat:~$ ./testmb MB_LEN_MAX: 16 MB_CUR_MAX: 1 äöüß mbrtowc(0xe4): -1 ÀöÌß mbrtowc(0xc3 0xa4): -1 emily@Cervelat:~$ export LC_CTYPE=de_DE emily@Cervelat:~$ locale LANG=de_DE.UTF-8 LANGUAGE=de_DE:de:en_GB:en LC_CTYPE=de_DE LC_NUMERIC="de_DE.UTF-8" LC_TIME="de_DE.UTF-8" LC_COLLATE="de_DE.UTF-8" LC_MONETARY="de_DE.UTF-8" LC_MESSAGES="de_DE.UTF-8" LC_PAPER="de_DE.UTF-8" LC_NAME="de_DE.UTF-8" LC_ADDRESS="de_DE.UTF-8" LC_TELEPHONE="de_DE.UTF-8" LC_MEASUREMENT="de_DE.UTF-8" LC_IDENTIFICATION="de_DE.UTF-8" LC_ALL= emily@Cervelat:~$ ./testmb MB_LEN_MAX: 16 MB_CUR_MAX: 1 äöüß mbrtowc(0xe4): -1 ÀöÌß mbrtowc(0xc3 0xa4): -1
System: Ubuntu Linux 06.06, gcc 4.03, glibc 2.3.6