Plattformübergreifender Unicode in C / C ++: Welche Codierung soll verwendet werden?

8

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:

  • wchar_t in Windows: Dateipfade ohne Probleme, ohne Probleme in sqlite lesen / schreiben. Das Schreiben von Daten in eine Datei sollte trotzdem in UTF-8 erfolgen.
  • wchar_t in Linux: Ausnahme für die Dateipfade aufgrund der UTF-8-Kodierung, Konvertierung vor dem Lesen / Schreiben in sqlite (wchar_t) und die gleiche für Windows beim Schreiben von Daten in eine Datei.

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     
ErikKou 28.06.2012, 00:18
quelle

2 Antworten

6

UTF-8 auf allen Plattformen mit Just-in-Time-Konvertierung in UTF-16 für Windows ist eine gängige Taktik für plattformübergreifendes Unicode.

    
Puppy 28.06.2012, 00:21
quelle
2

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.

    
Fozi 28.06.2012 00:41
quelle