Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

25.02.2009, 12:29

[Erledigt] UTF-8 via std::codecvt

Also, hab nen Wide-String (wchar_t) und muss den in UTF-8 (char) gepackt bekommen (SQLite kommt nur mit UTF-8 klar ... ). So da ich das ganze leider nicht auf eine Plattform beschränken darf/will, muss ich wohl hingehen und auf WideStringToMultiByte oder wie die Funktion inner WinAPI heißt verzichten. Damit wäre es ja schön einfach :P

Okay normal müsste ja der Weg des Std. die std::codecvt dafür sein ... für UTF-8 gibt's die ja von boost direkt dazu (bei filesystem).

Soweit so gut normal wird doch per:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
const bool encodeUTF8(std::wstring const& value, std::string& result)
{
    /*boost*/::utf8_codecvt_facet conv;
    const std::size_t max_size(conv.max_length() * (value.size() + 1));
    char* ptr_array(new char[max_size]);
    std::mbstate_t state;
    const wchar_t* from_next;
    char* to_next;
    if (conv.out(state, value.c_str(), value.c_str() + value.size(), from_next, ptr_array, ptr_array + max_size, to_next) != std::codecvt_base::ok) return false;
    *to_next = '\0';
    result = ptr_array;
    delete [] ptr_array;
    return true;
}
Dann korrekt umgewandelt werden, oder hab ich jetzt was falsch verstanden? :P

Bearbeitung
Hab gerade gelesen das std::mbstate_t auf MS-Plattformen mit 0 initialisiert werden muss? Weiß da einer genauer bescheid?
Devil Entertainment :: Your education is our inspiration
Der Spieleprogrammierer :: Community Magazin
Merlin - A Legend awakes :: You are a dedicated C++ (DirectX) programmer and you have ability to work in a team? Contact us!
Siedler II.5 RttR :: The old settlers-style is comming back!

Also known as (D)Evil

Anonymous

unregistriert

2

25.02.2009, 13:17

Also ich mache die Umwandlung von XYZ nach UTF-8 ausschließlich mit den Source-Codes von unicode.org und benutze keine STL dafür. Denn allein schon bei std::string merkt man, das UTF-8 hier der Supergau ist. Ich sage nur operator[], size, length usw..

Hier würde ich an deiner Stelle wirklich was eigenes nehmen, da die STL nicht für Multi-Byte Zeichensätze wie UTF-8 konzipiert wurde und man sich hier auf die Implementierung der STL verlassen "muss" und hier sind Welten von der einen und der anderen Implementierung :( Das musste ich leider bei einem sehr teuren Projekt merken :(

Aber Back-To-Topic: Die Konvertierung ist so richtig. In deinem Code werden sowieso intern aus der STL-Implementierung WideStringToMultiByte aufgerufen, da musst du dir also praktisch keine Gedanken zu machen.

Das Gurke

Community-Fossil

Beiträge: 1 996

Wohnort: Pinneberg

Beruf: Schüler

  • Private Nachricht senden

3

25.02.2009, 13:52

Ich kann ulong da soweit nur zustimmen. Hatte mit der STL (bzw diversen Implementierungen) und UTF8 schon so einiges an Problemen *sigh*. Waren zwar keine teuren Projekte oder so aber das war schon jenseits von gut und böse ...

Glücklicherweise "durfte" ich am Ende auf UTF16 umstellen, aber das ist bei dir ja anscheinend keine Option.

Zu dem Code konkret kann ich nix sagen, aber ich würde ihn zumindestens auf allen Plattformen sauber testen (wenn ihr sowas macht bestenfalls sogar automatisch, ist ja ein 1A Kandidat für automatische Tests).

4

25.02.2009, 14:43

Hm ich hab's jetzt ganz einfach auf UTF16 umgestellt :P Damit kommt SQLite auch klar und dann hab ich keine Probleme :P Auch wenn es so eigtl. auch ganz gut Funktioniert hattte :P Na egal ^^ ... we will se :P
Devil Entertainment :: Your education is our inspiration
Der Spieleprogrammierer :: Community Magazin
Merlin - A Legend awakes :: You are a dedicated C++ (DirectX) programmer and you have ability to work in a team? Contact us!
Siedler II.5 RttR :: The old settlers-style is comming back!

Also known as (D)Evil

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

5

26.02.2009, 07:40

Damit bist du schon geplatzt, weil auf 64 bit Linux ist wchar_t 32 bit breit.
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

Anonymous

unregistriert

6

26.02.2009, 10:29

Nox
Jop, dass kommt noch dazu. Das es nur eine absolute Mindestgröße gibt aber keine absolute Höchstgröße für Datentypen gibt.

Zeichensätze sind so was richtig schönes ;) Am Besten man schreibt sich ne eigene String-Klasse für sowas und verzichtet auf alle C und C++ Funktionen/Methoden um ganz sicher gehen zu können. Viel arbeit, aber allein schon im Verbund mit Datenbanken, rentiert sich sowas auf dauer sehr!

Kann nämlich recht schnell passieren, dass man das Programm portiert, die Größen anders sind oder die Implementierung der Standard Library abweicht und man so ordentlich die Datenbank schrottet. Alles schon gehabt beim Kunden. Sehr teuer.

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

7

26.02.2009, 12:34

Also ich nutze mbstowcs bzw wcstombs und habe da mit MySQL <-> Server <-> Client bei verschiedenen OS (32 bit Windows, 64 bit Linux, 32 bit Linux) bisher keine Probleme.
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

Anonymous

unregistriert

8

26.02.2009, 13:10

Wir hatten schon Probleme bei einem spanischen Kunden wegen diesen Zeichensatzgeschichten. Haben es am Ende auch mit den C-Funktionen ans laufen gebracht, aber in meinem privaten Projekt, womit ich mir später eine Firma mit aufbauen will, greife ich nur noch auf self-made und unicode.org zurück. Den C/C++-Funktion ist in Multi-Byte-Geschichten und Unicode im allgemeinen nicht so richtig zu trauen.

Werbeanzeige