UTF8 Zeichenketten im Speicher erstellen
-
Ich lese aus einem Prozess die Namen von Objekten aus und versuche diese zu identifizieren. Zum Auslesen der Objektnamen wird eine DLL injeziert. Das funktioniert für englische und deutsche Zeichenketten soweit wunderbar - doch jetzt bin ich bei der französischen Version auf Probleme gestoßen.
Französische Zeichen bzw. Buchstaben mit einem ^,´ oder ` werden vom Prozess nicht mit einem Byte sondern mit zwei Bytes gespeichert.
Mit Hilfe von Notepad habe ich testweise den Text "Herbe démoniaque des montagnes" in verschiedenen Formaten gespeichert. Dann habe ich mir die Testdateien mit einem Hexeditor angesehen und festgestellt das UTF8 höchstwarscheinlich das Format ist was ich brauche. Sowohl im Prozess als auch in der UTF8-Textdatei wird das 'é' als 0xC3,0xA9 gespeichert. Die restlichen Zeichen belegen ein Byte.
das eigentlich Problem:
// 'H' 'e' 'r' 'b' 'e' ' ' 'd' 'é' 'm' 'o' 'n' 'i' 'a' 'q' 'u' 'e' ' ' 'd' 'e' 's' ' ' 'm' 'o' 'n' 't' 'a' 'g' 'n' 'e' 's' char text1[] = {0x48,0x65,0x72,0x62,0x65,0x20,0x64,0xC3,0xA9,0x6D,0x6F,0x6E,0x69,0x61,0x71,0x75,0x65,0x20,0x64,0x65,0x73,0x20,0x6D,0x6F,0x6E,0x74,0x61,0x67,0x6E,0x65,0x73,0x00}; // UTF8 Zeichenkette erstellen? //char text2[] = "Herbe démoniaque des montagnes" // Vergleich // memcmp ?text1 ist ein vorgegebener String. Dieser darf nicht verändert oder konvertiert werden das die Performance an dieser Stelle sehr wichtig ist.
Ich möchte eine zweite Zeichenkette (test2) im selben Format (UTF8) erstellen. Weiß aber nicht wie?!
Um das Objekt dann zu identifizieren werden beide Zeichenketten verglichen. Das könnte ich zur Not auch mit memcmp() machen.
-
Also dieses é ist extended ascii:
Ansonsten vllt. mal wchar_t & wcscmp()?
http://msdn.microsoft.com/en-us/library/e0z9k731(VS.80).aspx
-
Habe die Lösung gefunden, extrem einfach, wenn man nur erstmal einen Durchblick hat in dem ASCII/ANSI/UNICODE/CHAR/WCHAR_T/UTF8-Dschungel hat, die Kurzversion:
wchar_t source[] = L"Herbe démoniaque des montagnes"; char target[64]; // utf8 string WideCharToMultiByte(CP_UTF8,0,(LPCWSTR)source,-1,(LPSTR)target,sizeof(target),0,0);Wenn man sich die Parameter von WideCharToMultiByte() anschaut, kann man die Funktion auch zweimal aufrufen - einmal um die Länge der Zeichenkette im UTF8-Format als Returnwert zu bekommen - und einmal um für das eigentliche Konvertieren zu UTF8. Sollte man eventl. in Betracht ziehen für längere Zeichenketten um Speicher zu sparen.
Also dieses é ist extended ascii
Nein, es belegt zwei bytes. ASCII/ANSI belegt immer nur 1 byte.
Noch besser wäre eine portable Lösung komplett ohne Konvertierung. Das Speichern der wchar_t-Zeichenketten als Quelle für die Konvertierung frisst unnötig Speicher in der DLL und die Konvertierung verlängert die Ladezeit.

-
Nanana... so einfach ist das aber auch wieder nicht... Du hast Dich noch nie mit Combining Characters beschäftigt...
http://www.c-plusplus.net/forum/viewtopic-var-t-is-161855.htmlMan kann auch in UTF16 ein á mit zwei 16-Bit Codepoints darstellen! Und damit wird das ganze in UTF8 natürlich noch komplexer; es können dann da 4 oder mehr Bytes für ein Zeichen entstehen...