2009-05-21 7 views
16

Ich versuche, plattformübergreifenden i18n C++ Code zu schreiben. Da die meisten Linux-Systeme lieber UTF-8 als Zeichencodierung verwenden, dachte ich, dass ich string für Linux und wstring für Windows verwenden sollte. Ist tchar.h auf Linux verfügbar? Was ist ein äquivalenter Ersatz für tchar.h unter Linux?tchar.h unter Linux

Antwort

11

Sie können this Artikel nützlich finden. Insbesondere diskutieren sie kurz vor der Verwendung von TCHAR und dem Umgang mit Windows-Code.

Der Artikel Zusammenfassung ist:

TCHAR wird in einem breiten Zeichendatentyp übersetzt werden, wenn Sie diesen Code mit dem GNU C Compiler kompiliert (die meisten tragbaren Bibliotheken definieren TCHAR in ihren Kopf- und beziehen sich auf wchar_t). Dies war in der Tat, wie ich mein C++ - Programm in einen Anagramm-Generator verwandelte: Ich verwendete C++ - Standardzeichenfolgen, die mit UTF-8 gefüllt waren, und fütterte die Daten mit Zeigern, die an wchar_t an Bibliotheksfunktionen übergeben wurden. UTF-8-Daten, die als UTF-32 interpretiert werden, sind gleichbedeutend mit "Müll" (aber sie sind sehr nützlich für die Verschleierung von Daten und Fehlern).

+4

Um klar zu sein, tchar.h ist nur Windows. Aber es ist ziemlich trivial, selbst tchar.h zu rollen. – Naaff

0

Es ist eigentlich nicht so einfach. string.size() gibt Ihnen die Anzahl der UTF-8-Bytes, nicht Unicode-Zeichen. Bei aller Fairness wird wstring.size() nicht die Anzahl der Zeichen in Anwesenheit von Surrogaten geben. In der Praxis werden diese jedoch nicht in gängigen Apps verwendet.

Also, die wirkliche Antwort hängt wirklich davon ab, warum Sie die Unicode-Zeichenfolgen benötigen. Ist es nur die Lokalisierung einer Benutzeroberfläche? Haben Sie Benutzereingaben? Müssen Sie diese Eingabe analysieren?

0

Um meine Windows zentrische Quelle zu erstellen, konnte ich die Datei tchar.h aus Cygwins Datei im Ordner cygwin \ usr \ include \ w32api verwenden.

Ich baue tatsächlich mit Android NDK. Für meine Zwecke habe ich eine Kopie von tchar.h erstellt und gepatcht.

//#include <crtdefs.h> 

#define _CRTIMP 

//#define _strninc(_pc,_sz) (((_pc)+(_sz))) 
// _CRTIMP size_t __cdecl __strncnt(const char *_Str,size_t _Cnt);