UTF-8: Wie fängt man an??
-
Hallo!
Vorab: Ja, ich habe bereits danach gesucht, und auch einige nette Dokus zu dem Thema gefunden und gelesen.
Dennoch habe ich noch ein paar Fragen bzgl. UTF-8 und wie ich Unicode einsetze, da mir uns den Tutorials, wo über Codierungsformen usw. berichtet wird nicht einfach mal drinsteht, wie man, anhand eines einfachen Beispiels Unicode bzw. UTF-8 praktisch anwendet.
Mich würde erstmal interessieren, wie ich einen Array-Of-Char, in den ich UTF-8 codierten Text schreiben will, speichere. Wie muss ich diesen deklarieren? Wie schreibe ich mit einem strcpy() was rein? Wie kann ich diesen auf der Konsole ausgeben und wie in eine Unicode-Datei schreiben? MUSS ich spezielle Header inkludieren und wenn ja welche? Welche Funktionen brauche ich für Unicode? Muss ich meinem Compiler für Unicode spezielle Flags mitgeben?
Ein kleines Beispiel (habe es ausgeführt auf einem Windows XP Rechner und compiliert mit MSVC8):
#include <stdlib.h> #include <stdlib.h> int main( int argc, char** argv ) { char doof[128+1]; strcpy( doof, "Unicode ist döch ein büsschen kämisch..." ); printf( ">%s<\n", doof ); getchar(); return 0; }
Klar kommt hierbei raus ">Unicode ist d÷ch ein b³sschen kõmisch...<" (ich benutze ein englischsprachiges Windows XP), und wenn ich schreibe (wie hier in einigen Beiträgen gezeigt):
#include <stdlib.h> #include <stdlib.h> int main( int argc, char** argv ) { char doof[128+1]; strcpy( doof, "Unicode ist d\x94ch ein b\x81sschen k\x84misch..." ); printf( ">%s<\n", doof ); getchar(); return 0; }
Dann meckern der Compiler natürlich an
test.c
test.c(8) : error C2022: '2380' : too big for characterIch denke mal, das der char ja schon nicht ausreicht, und ich int oder unsigned char oder ähnliches nehmen muss, nur tue ich dies, erhalte ich selbe Fehlermeldung, was wohl daran liegt das der Compiler den String "Unicode ist d\x94ch ein b\x81sschen k\x84misch..." natürlich als char-Pointer erwartet, und dann auf die Schnautze fliegt, was darauf schließen lässt das ich vielleicht doch eine COmpileroption brauche??
Danke & Gruß
~code_pilot
-
hi,
für unicode (in C heisst der 'extended character set') gibt's den datentyp 'wchar_t' und bei stringliteralen musste ein grosses 'L' davor schreiben. beispiel:... wchar_t *wstr = L"hello_wide_chars"; wprintf (L"%s\n", wstr); ...
das hat aber nix mit UTF-8 zu tun.
UTF-8 ist ein kompressionsformat für unicodes.
guckst du: http://en.wikipedia.org/wiki/UTF-8
-
ten schrieb:
das hat aber nix mit UTF-8 zu tun.
UTF-8 ist ein kompressionsformat für unicodes.
guckst du: http://en.wikipedia.org/wiki/UTF-8Das heißt also, das ich immer mit wchar_t arbeiten muß, und UTF-8 nur verwende, um die Daten abzuspeichern bzw. im Speicher zu halten?? In einem dieser Einführungen zu Unicode hab ich gelesen, das man wchar_t nicht verwendent sollte, weil es eben sehr viel Speicher verbraucht.
Also das hier klappt:
#include <stdlib.h> #include <stdlib.h> int main( int argc, char** argv ) { wchar_t doof[128+1]; wcscpy( doof, L"Unicode ist d\x94ch ein b\x81sschen k\x84misch..." ); wprintf( L">%s<\n", doof ); getchar(); return 0; }
Nur muss ich - und dem stimmen sicherlich einige hier zu - sagen daß dieses wcscpy(= und wprintf() mit dem L"..."-Formatstring irgendwie ziemlich bescheuert aussieht... man bricht sich ja schon beim eintippen von wcscpy() einen ab
Was besseres gibt es hier nicht?
~code_pilot
-
code_pilot schrieb:
Das heißt also, das ich immer mit wchar_t arbeiten muß, und UTF-8 nur verwende, um die Daten abzuspeichern bzw. im Speicher zu halten??
kommt drauf an. wenn man ne tolle unicode-library hat, kommt man vielleicht auch ohne wchar_t aus, aber von sich aus hat C nix besseres...
code_pilot schrieb:
In einem dieser Einführungen zu Unicode hab ich gelesen, das man wchar_t nicht verwendent sollte, weil es eben sehr viel Speicher verbraucht.
wchar_t ist meistens grösser als char, oft 16 bits pro zeichen. braucht also schon mehr speicher als 'char'
code_pilot schrieb:
Was besseres gibt es hier nicht?
glaub' nicht. irgendwelche libraries wie 'libutf8' vielleicht, aber damit geht's auch nicht viel besser. C bietet da nicht so viel komfort, also library im internet suchen, irgendwas selber basteln oder java nehmen...
:xmas2:
-
du hast es ja auch sinnlos gemacht. das wcscpy hättest du gar nicht gebraucht.
siehe hier:
#include <stdlib.h> #include <stdlib.h> int main( int argc, char** argv ) { wprintf(L"Unicode ist d\x94ch ein b\x81sschen k\x84misch..."); getchar(); return 0; }
-
code_pilot schrieb:
Hallo!
Dann meckern der Compiler natürlich antest.c
test.c(8) : error C2022: '2380' : too big for characterIch denke mal, das der char ja schon nicht ausreicht, und ich int oder unsigned char oder ähnliches nehmen muss, nur tue ich dies, erhalte ich selbe Fehlermeldung, was wohl daran liegt das der Compiler den String "Unicode ist d\x94ch ein b\x81sschen k\x84misch..." natürlich als char-Pointer erwartet, und dann auf die Schnautze fliegt, was darauf schließen lässt das ich vielleicht doch eine COmpileroption brauche??
Danke & Gruß
~code_pilot
Speziell zu diesem Teil deiner Frage solltest du dir mal diesen Artikel ansehen.
http://www.c-plusplus.net/forum/viewtopic-var-t-is-39326.html
-
DrakoXP schrieb:
du hast es ja auch sinnlos gemacht. das wcscpy hättest du gar nicht gebraucht.
siehe hier:
#include <stdlib.h> #include <stdlib.h> int main( int argc, char** argv ) { wprintf(L"Unicode ist d\x94ch ein b\x81sschen k\x84misch..."); getchar(); return 0; }
Lieber Draco,
ich bin der Programmiersprache C vermutlich länger mächtig als du, daher unterlasse bitte solche sinnlosen Äusserungen. Mir ging es um das Prinzip, nicht um den Sinn.
@der Rest: Danke für eure Antworten. Dann muss ich mal gucken ob ich eine Unicode-Library finde oder mir halt selber eine bauen.