Ich arbeite gerade an einem Hobby-Projekt (C / C ++), das sowohl unter Windows als auch unter Linux mit voller Unicode-Unterstützung laufen soll. Leider verwenden Windows und Linux verschiedene Kodierungen, die unser Leben erschweren.
In meinem Code versuche ich, die Daten so universell wie möglich zu verwenden, was es sowohl für Windows als auch für Linux einfach macht. In Windows ist wchar_t standardmäßig als UTF-16 und als UCS-4 in Linux (korrigiere mich wenn ich falsch liege).
Meine Software wird geöffnet ({_wfopen, UTF-16, Windows}, {fopen, UTF-8, Linux}) und schreibt Daten in Dateien in UTF-8. Bis jetzt ist alles machbar. Bis ich mich dazu entschloss, SQLite zu verwenden.
Die C / C ++ - Schnittstelle von SQLite ermöglicht ein- oder zwei-Byte-codierte Strings ( click ). Natürlich funktioniert das nicht mit wchar_t in Linux, da die wchar_t in Linux standardmäßig 4 Bytes beträgt. Daher erfordert Schreiben und Lesen von SQLite eine Konvertierung für Linux.
Gegenwärtig ist der Code mit Ausnahmen für Windows / Linux überladen. Ich hatte gehofft, bei der Standard-Idee zu bleiben, Daten in wchar_t zu speichern:
Nach dem Lesen ( hier ) war ich überzeugt, dass ich sollte bei wchar_t in Windows bleiben. Aber nachdem alles funktioniert hatte, begannen die Probleme mit der Portierung auf Linux.
Momentan denke ich darüber nach, alles neu zu machen, um mit einfachem Zeichen (UTF-8) zu bleiben, weil es sowohl mit Windows als auch mit Linux funktioniert, wobei ich daran denke, dass ich jede Zeichenfolge in Windows 'WideCharToMultiByte' benötigen muss, um UTF zu erreichen -8. Die Verwendung von einfachen char * -basierten Strings wird die Anzahl der Ausnahmen für Linux / Windows erheblich reduzieren.
Haben Sie Erfahrung mit Unicode für Cross-Plattform? Irgendwelche Gedanken über die Idee, Daten einfach in UTF-8 zu speichern, statt wchar_t?
zu verwenden Unsere Software ist auch plattformübergreifend und wir hatten ähnliche Probleme. Wir haben uns entschieden, dass wir möglichst wenig Conversions erzielen möchten. Das bedeutet, dass wir wchar_t
für Windows und char
für Unix / Mac verwenden.
Wir tun dies, indem wir _T
und LPCTSTR
und ähnliches unter Unix unterstützen und generische Funktionen haben, die leicht zwischen std::string
und std::wstring
konvertieren. Wir haben auch eine generische std::basic_string<TCHAR>
( tstring
), die wir in den meisten Fällen verwenden.
Bisher funktioniert das ganz gut. Die meisten Funktionen haben einen tstring
oder einen LPCTSTR
und diejenigen, die dies nicht tun, erhalten ihre Parameter von tstring
konvertiert. Das bedeutet, dass wir die Strings meistens nicht konvertieren und die meisten Parameter nicht durchlaufen.
Tags und Links windows linux unicode cross-platform wchar-t