Ich habe eine Frage:
Einige Bibliotheken verwenden WCHAR als Textparameter und andere verwenden CHAR (als UTF-8): Ich muss wissen, wann WCHAR oder CHAR verwendet werden soll, wenn ich meine eigene Bibliothek schreibe.
Verwende char
und behandle es als UTF-8. Dafür gibt es viele Gründe; Diese Website fasst es viel besser zusammen als ich:
Es wird empfohlen, von wchar_t
nach char
(UTF-16 in UTF-8) zu konvertieren, sobald Sie es von einer Bibliothek erhalten haben, und zurück zu konvertieren, wenn Sie Zeichenfolgen an es übergeben müssen. Um Ihre Frage zu beantworten, verwenden Sie immer char
, außer an der Stelle, an der Sie für eine API wchar_t
übergeben oder empfangen müssen.
WCHAR
(oder wchar_t
auf Visual C ++ - Compiler) wird für Unicode UTF-16 -Strings verwendet.
Dies ist die "native" Zeichenfolgencodierung, die von Win32-APIs verwendet wird.
CHAR
(oder char
) kann für mehrere andere Zeichenfolgenformate verwendet werden: ANSI, MBCS, UTF-8.
Da UTF-16 die native Codierung von Win32-APIs ist, möchten Sie möglicherweise WCHAR
(und besser eine darauf basierende String-Klasse wie std::wstring
) in der Win32-API verwenden Grenze, in Ihrer App.
Und Sie können UTF-8 (also, CHAR
/ char
und std::string
) verwenden, um Ihren Unicode-Text außerhalb Ihrer Anwendungsgrenze auszutauschen. Zum Beispiel: UTF-8 ist im Internet weit verbreitet, und wenn Sie UTF-8-Text zwischen verschiedenen Plattformen austauschen, haben Sie nicht das Problem der Endianität (stattdessen müssen Sie mit UTF-16 sowohl das UTF-16BE big-endian und die UTF-16LE little-endian -Fälle).
Sie können zwischen UTF-16 und UTF-8 mithilfe der Win32-APIs WideCharToMultiByte()
und MultiByteToWideChar()
konvertieren. Dies sind reine C-APIs, und diese können bequem in C ++ - Code eingebettet werden, wobei statt roher Zeichenzeiger String-Klassen und Ausnahmen anstelle von rohen Fehlercodes verwendet werden. Sie finden hier ein Beispiel .
Die richtige Frage ist nicht, welcher Typ verwendet werden soll, sondern wie Ihr Vertrag mit Ihren Bibliotheksbenutzern sein soll. Sowohl char als auch wchar_t können mehr als eine Sache bedeuten.
Die richtige Antwort für mich ist, verwenden Sie char und betrachten Sie alles utf-8 codiert, wie utf8everywhere.org suggeriert. Dies erleichtert auch das Schreiben von plattformübergreifenden Bibliotheken.
Stellen Sie jedoch sicher, dass Sie Strings korrekt verwenden. Einige APIs wie fopen () akzeptieren eine Zeichenfolge char * und behandeln sie anders (nicht als UTF-8), wenn sie unter Windows kompiliert werden. Wenn Unicode für Sie wichtig ist (und es wahrscheinlich ist, wenn Sie mit Strings arbeiten), müssen Sie Ihre Strings korrekt behandeln. Ein gutes Beispiel ist in boost :: locale zu sehen. Ich empfehle auch, boost :: nowide unter Windows zu verwenden, damit die Zeichenfolgen in der Bibliothek korrekt behandelt werden.
In Windows bleiben wir bei WCHARS. std :: wstring. Hauptsächlich weil, wenn Sie nicht enden, müssen Sie konvertieren, weil Windows-Funktionen aufrufen.
Ich habe das Gefühl, dass der Versuch, utf8 intern einfach wegen Ссылка zu verwenden, uns später in den Hintern beißen wird / p>
Es wird empfohlen, bei der Entwicklung einer Windows-Anwendung auf TCHARs zurückzugreifen. Das Gute an TCHARs ist, dass es sich entweder um normale Zeichen oder um wchars handeln kann, je nachdem, ob die Unicode-Einstellung gesetzt ist oder nicht. Sobald Sie auf TCHARs zurückgreifen, stellen Sie sicher, dass alle verwendeten Zeichenfolgenmanipulationen ebenfalls mit dem Präfix _t beginnen (z. B. _tcslen für die Länge der Zeichenfolge). Auf diese Weise wissen Sie, dass Ihr Code sowohl in Unicode- als auch in ASCII-Umgebungen funktioniert.