2009-10-07 9 views
11

Je mehr ich mit C++ - Locale-Facetten arbeite, desto mehr verstehe ich - sie sind gebrochen.Gibt es Updates der Lokalisierungsunterstützung in C++ 0x?

  • std::time_get - nicht mit std::time_put (wie es in C strftime/strptime) symmetrisch und erlaubt kein einfaches Parsing Mal mit AM/PM Mark.
  • I discovered Kürzlich kann diese einfache Zahlenformatierung unter bestimmten Gebietsschemata illegales UTF-8 erzeugen (wie ru_RU.UTF-8).
  • std::ctype ist sehr vereinfachend unter der Annahme, dass nach oben/nach unten kann auf der Basis pro Zeichen erfolgen (Fall Konvertierung kann die Anzahl der Zeichen ändern und es ist abhängig von Kontext).
  • std::collate - unterstützt keine Sortierungsstärke (Groß-/Kleinschreibung oder Insensitivität).
  • Es gibt keine Möglichkeit, die Zeitzone anders als die globale Zeitzone in der Zeitformatierung anzugeben.

Und vieles mehr ...

  • Hat jemand weiß, ob Änderungen in Standard Facetten in C++ 0x erwartet werden?
  • Gibt es eine Möglichkeit, eine Bedeutung solcher Änderungen zu bringen?

Danke.

EDIT: Clarifications, falls die Verbindung nicht zugänglich ist:

std::numpunct definiert Tausendertrennzeichen als char. Also, wenn Trennzeichen in U + 2002 - andere Art von Raum kann nicht als einzelnes Zeichen in UTF-8 aber als mehrere Byte-Sequenz reproduziert werden.

In C API struct lconv definiert Tausende Trennzeichen als Zeichenfolge und leidet nicht unter diesem Problem. Wenn Sie also versuchen, Zahlen mit Trennzeichen außerhalb von ASCII mit UTF-8-Gebietsschema zu formatieren, wird ungültiges UTF-8 erstellt.

um diesen Fehler zu schreiben 1234 std reproduzieren: Ostream mit tränkt ru_RU.UTF-8 locale

EDIT2: ich, dass POSIX C Lokalisierung API arbeitet viel glatter muss zugeben:

  • Es gibt Inverse von strftime - - strptime (strftime tut das gleiche wie)
  • Keine Probleme mit der Formatierung von Zahlen wegen der oben genannten Punkt.

Allerdings ist es immer noch für perfecet.

EDIT3: Nach den neuesten Hinweise zu C++ 0x kann ich sehen, dass std::time_get::get - ähnlich wie strptime und gegenüber std::time_put::put.

+0

Sie scheinen glücklich zu sein, die std :: locale funktioniert überhaupt. Ich hatte noch nie einen Erfolg mit MingW. – UncleBens

+0

Der einzige Link in Ihrer Antwort ist gebrochen und tut nicht offen (nicht überraschend, da es '.no-ip.info' ist, denke ich, aber da es ein Teil der Frage ist, möchtest du es vielleicht woanders hinstellen, damit es zugänglich ist.) –

+0

Mingw unterstützt kein Gebietsschema akzeptiert C/POSIX, aber unter Linux Locale Unterstützung ist sehr gut. BTW C-Bibliothek API viel sauberer, besser gestaltet und in der Regel funktioniert viel reibungsloser. Aber ... POSIX API erlaubt nur ein Gebietsschema pro Prozess, der ziemlich einschränkend ist. – Artyom

Antwort

1

std::numpunct ist eine Vorlage. Alle Spezialisierungen versuchen, das Dezimaltrennzeichen zurückzugeben.Offensichtlich sollten Sie in jedem Gebietsschema, in dem dies ein breites Zeichen ist, std::numpunct<wchar_t> verwenden, da die <char Spezialisierung das nicht kann.

Das heißt, C++ 0x ist ziemlich fertig. Wenn jedoch gute Verbesserungen fortfahren, wird das C++ - Komitee wahrscheinlich C++ 1x starten. Das ISO C++ Komitee nimmt Ihre Hilfe sehr wahrscheinlich an, wenn es von Ihrer nationalen ISO-Mitgliedsorganisation angeboten wird. Ich sehe, dass Pavel Minaev einen Fehlerbericht vorgeschlagen hat. Das ist technisch möglich, aber die Probleme, die Sie beschreiben, sind allgemeine Designbeschränkungen. In diesem Fall besteht die sicherste Vorgehensweise darin, eine Boost-Bibliothek zu entwerfen, die Boost-Überprüfung bestehen zu lassen, sie für die Aufnahme in den Standard einzureichen und an den ISO C++ - Sitzungen teilzunehmen, um dort auftretende Probleme zu behandeln.

+0

„sollten Sie std :: numpunct “, Wchar_t eine der Möglichkeiten ist Unicode-Punkt zur Verfügung zu stellen.“ Was passiert, wenn eine solche Stelle geschieht außerhalb von BMP platziert und sizeof (wchar_t) == 2? Was passiert, wenn eine solche Trennung besteht aus mehr als einem Zeichen? Das ist genau das gleiche Problem! Auch wenn Sie UTF-8-Gebietsschema verwenden, sollten Sie erwarten, dass Zeichen größer als 1 Byte sein können.Die richtige Lösung ist stattdessen liefern (CharT const *) Ergebnis zurückgeben von CharT. In jedem Fall, wenn Sie ein einfaches Programm schreiben, das Zahlen ausgibt, erwarten Sie, dass es korrekt mit Unicode umgehen kann - wie dies in C-Lokalisierung geschieht. – Artyom

+0

Der Entwurf von 'wchar_t' ist so, dass ein einzelnes' wchar_t' ein beliebiges von der Implementierung unterstütztes Zeichen enthalten kann. Aus diesem Grund kann eine Implementierung mit 16-Bit wchar_t nicht alle Unicode 5.0-Zeichen unterstützen. Es müsste eine unterstützte Teilmenge auswählen, beispielsweise die BMP. In ISO C++ gibt es keine solche "multi-wchar_t string". Eine Implementierung ist jedoch frei, ein '__char16' oder ein' __char32' zu definieren und 'std :: numpunct <>' für sie zu spezialisieren. – MSalters

+0

"Eine Implementierung mit 16 Bits wchar_t kann nicht alle Unicode 5.0 unterstützen" Es können nicht alle Unicode 2.0 unterstützt werden, bei denen die ersten Ersatzzeichen eingeführt wurden. "In ISO C++ gibt es keine solche" multi-wchar_t string "- Was ist mit UTF-16? 'wchar_t const *' ist vollkommen in Ordnung. Werfen Sie einen Blick dorthin: http://linux.die.net/man/7/locale. Das Tausendertrennzeichen wird als 'char *' in 'struct lconv' dargestellt, sodass es kein Problem gibt, ein Unicode-Zeichen in UTF-8-Gebietsschema darzustellen. – Artyom

4

Ich stimme dir zu, C++ fehlt die richtige i18n Unterstützung.

Weiß jemand, ob Änderungen in Standardfacetten in C++ 0x erwartet werden?

Es ist zu spät im Spiel, also wahrscheinlich nicht.

Gibt es eine Möglichkeit, eine Bedeutung solcher Änderungen zu bringen?

Ich bin sehr pessimistisch darüber.

Stroutrup behauptete direkt, dass er keine Probleme mit dem aktuellen Status sieht. Und ein anderer der großen C++ - Leute (Buchautor und alle) hat nicht einmal gemerkt, dass wchar_t ein Byte sein kann, wenn Sie den Standard lesen.

Und einige Threads in Boost (die die Richtung in die Zukunft zu fahren scheint) zeigen so wenig Verständnis, wie das funktioniert, das ist wirklich gruselig.

C++ 0x kaum hinzugefügt einige Unicode-Charakter-Datentypen, spät im Spiel und nach viel Mühe. Ich halte nicht zu lange den Atem an.

Ich denke, die einzige Chance, etwas besser zu sehen ist, wenn jemand wirklich gut/respektiert in den i18n und C++ Welten direkt in die nächste Version des Standards einbezogen wird. Keine Ahnung, wer das sein könnte :-(