3 Stimmen

Spanische Zeichen in C++ Windows/Mac/iOS

Ich habe einige Probleme mit spanischen Zeichen, die in einer iOS-App angezeigt werden. Der Code in Frage ist alle C++, und geteilt zwischen einer Windows-App und eine iOS-App. Kompiliert in Windows mit Visual Studio 2010 (Zeichensatz ist Multi-Byte). Und kompiliert mit Xcode 4.2 auf dem Mac.

Zurzeit verwendet der Code char-Zeiger, und mein erster Gedanke war, dass ich stattdessen zu wchar_t-Zeigern wechseln muss. Mir ist jedoch aufgefallen, dass die spanischen Zeichen, die ich ausgeben möchte, in Windows mit char-Zeigern problemlos angezeigt werden. Das brachte mich auf den Gedanken, dass diese Zeichen Teil des Multi-Byte-Zeichensatzes sind und ich mir nicht die Mühe machen muss, alles auf wchar_t zu aktualisieren, bis ich bereit bin, einige japanische, russische, arabische usw. Übersetzungen zu machen.

Leider werden die spanischen Zeichen in der Windows-Anwendung zwar richtig angezeigt, aber nicht, wenn sie auf dem Mac/iOS erscheinen. Experimentieren mit wchar_t gibt, sehe ich, dass sie richtig angezeigt werden, wenn ich alles über konvertieren. Aber was ich nicht verstehe, und ich hoffe, jemand kann mich aufklären, wie der Grund ... ist, warum sind die Zeichen perfekt gültig auf dem Windows-Rechner, gleichen Code, und Dislaying als Kauderwelsch (erfordern wchar_t statt) in der Mac-Umgebung?

Macht Visual Studio etwas mit meinen Zeichenzeigern hinter den Kulissen, was der Mac nicht tut? Mit anderen Worten: Ist die Microsoft-Umgebung einfach nachsichtiger mit meinem architektonischen Versehen, als ich char-Zeiger anstelle von wchar_t verwendet habe?

Da ich bereits weiß, dass meine Antwort von char-Zeigern zu wchar_t-Zeigern konvertieren ist, ist meine eigentliche Frage dann "Warum erfordert der Mac wchar_t, aber in Windows kann ich char für die gleichen Zeichen verwenden?"

Danke.

3voto

StilesCrisis Punkte 15626

Mac und Windows verwenden unterschiedliche Codepages - beide haben spanische Zeichen verfügbar aber sie werden als unterschiedliche Zeichenwerte angezeigt, so dass dieselben Bytes auf jeder Plattform anders aussehen.

Der beste Weg, um die Lokalisierung in einer plattformübergreifenden Codebasis zu bewältigen, ist UTF8. UTF8 wird nativ in NSString -stringWithUTF8String: und in Windows-Unicode-Anwendungen durch den Aufruf von MultiByteToWideChar mit CP_UTF8 unterstützt. Da es sich um Unicode handelt, können Sie die gleiche Technik sogar für kompliziertere Sprachen wie Chinesisch verwenden.

Verwenden Sie keine breiten Zeichen in plattformübergreifendem Code, wenn Sie es vermeiden können. Das wird kompliziert, weil wchar_t unter OS X 32 Bit breit ist. Tatsächlich ist es auch aus diesem Grund speicherfressend.

http://en.wikipedia.org/wiki/UTF-8

2voto

Keine der char , wchar_t , string o wstring eine beliebige Kodierung zugewiesen werden. Sie enthalten einfach die Binärsuppe, als die Ihr Compiler die Quelldateien interpretieren will. Sie haben drei Variablen, die falsch sein könnten:

  1. Was Ihr Code enthält (in der eigentlichen Datei, zwischen den '"'-Zeichen, auf binärer Ebene).
  2. Was Ihr Compiler denkt, dass dies ist. Sie können zum Beispiel eine UTF-8-Quelldatei haben, aber der Compiler könnte aus wchar_t[] Literale in das richtige UCS-4-Format umzuwandeln. (Ich wünschte, MSVC 2010 könnte dies tun, aber soweit ich weiß, unterstützt es UTF-8 überhaupt nicht).
  3. Was Ihre Rendering-API erwartet. Unter Windows ist dies normalerweise Little-Endian UTF-16 (als LPWCHAR Zeiger). Für die alte LPCHAR APIs ist es in der Regel die "aktuelle Codepage", die sein kann alles Soweit ich weiß. iOS und Mac OS verwenden intern UTF-16, glaube ich, aber sie sind sehr explizit darüber, was sie akzeptieren und zurückgeben.

Keine Klasse oder Kodierung kann Ihnen helfen, wenn es eine Unstimmigkeit zwischen diesen gibt.

In einer IDE wie Xcode oder Eclipse können Sie die Kodierung einer Datei in ihrem Eigenschaftsblatt sehen. In Xcode 4 ist dies das Fenster ganz rechts. Wenn es ausgeblendet ist, rufen Sie es mit cmd+alt+0 auf. Wenn die Zeichen im Code-Editor richtig aussehen, ist die Kodierung korrekt. Ein erster Schritt besteht darin, sicherzustellen, dass Xcode und MSVC die gleichen Quelldateien auf die gleiche Weise interpretieren. Dann müssen Sie herausfinden, was sie direkt vor dem Rendern in den Speicher übertragen werden. Und dann müssen Sie sicherstellen, dass beide Rendering-APIs den gleichen Zeichensatz überhaupt erwarten.

Oder verschieben Sie Ihre Zeichenketten einfach in Textdateien, die von Ihrem Quellcode getrennt sind, und in einer klar definierten Kodierung. UTF-8 ist großartig dafür, aber alles, was alle notwendigen Zeichen kodieren kann, funktioniert. Dann übersetzen Sie Ihre Zeichenketten nur zum Rendern (falls erforderlich).

Ich habe gerade diese Antwort gesehen, die noch mehr Gründe für die letzte Option liefert: https://stackoverflow.com/a/1866668/401925

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X