Frage

Ich versuche immer noch zu entscheiden, ob mein (home) Projekt verwenden sollte UTF-8 Strings (implementiert in Form von std :: string mit zusätzlichen UTF-8-spezifischen Funktionen bei Bedarf) oder einen 16-Bit-String (implementiert als std :: wstring). Das Projekt ist eine Programmiersprache und Umgebung (wie VB, es ist eine Kombination von beiden).

Es gibt ein paar Wünsche / Einschränkungen:

  • Es wäre cool, wenn sie auf begrenzten Hardware wie Computer mit begrenztem Speicher ausgeführt werden könnte.
  • Ich möchte den Code auf Windows, Mac laufen zu lassen und (wenn die Ressourcen erlauben) Linux.
  • Ich werde mit WxWidgets als meine GUI-Schicht, aber ich möchte den Code, mit dem interagiert Toolkit in einer Ecke der Code-Basis beschränkt (ich werde nicht-GUI ausführbare Dateien hat).
  • Ich möchte mit zwei verschiedenen Arten von Zeichenketten vermeiden, arbeiten, wenn sie mit den Benutzer sichtbaren Text zu arbeiten und mit den Anwendungsdaten.

Zur Zeit arbeite ich mit std :: string, mit der Absicht, nur UTF-8-Manipulation Funktionen bei Bedarf. Es erfordert weniger Speicher und scheint die Richtung viele Anwendungen werden ohnehin zu sein.

Wenn Sie empfehlen eine 16-Bit-Codierung, welche: UTF-16 ? UCS-2 ? Ein anderes?

War es hilfreich?

Lösung

Ich würde UTF-16 für jede Art von Datenmanipulation und UI empfehlen. Der Mac OS X und Win32-API verwendet UTF-16, das gleiche für wxWidgets, Qt, ICU, Xerces und andere. UTF-8 könnte für den Datenaustausch und die Lagerung besser sein. Siehe http://unicode.org/notes/tn12/ .

Aber was auch immer Sie sich entscheiden, würde ich auf jeden Fall empfehlen, gegen std :: string mit UTF-8 "nur bei Bedarf".

Gehen Sie den ganzen Weg mit UTF-16 oder UTF-8, aber mischen und zusammenzupassen nicht, dass für Ärger bittet.

Andere Tipps

UTF-16 ist immer noch eine variabler Länge Zeichencodierung (es gibt mehr als 2 ^ 16 Unicode-Codepunkte), so kann man nicht O (1) string Indizierungsvorgänge tun. Wenn Sie viele solche Dinge tun, du sparen Sie nichts in der Geschwindigkeit über UTF-8. Auf der anderen Seite, wenn Ihr Text viele Codepoints im 256-65535 Bereich umfasst, UTF-16 kann eine wesentliche Verbesserung in der Größe sein. UCS-2 ist eine Variation UTF-16, die ist feste Länge, auf Kosten verbieten jegliche Codepunkte größer als 2 ^ 16.

Ohne mehr über Ihre Anforderungen zu kennen, würde ich persönlich für UTF-8 gehen. Es ist die einfachste zu behandeln für alle Gründe, andere haben bereits aufgeführt.

Ich habe noch nie irgendwelche Gründe etwas anderes zu benutzen als UTF-8 um ehrlich zu sein.

Wenn Sie mit UTF-8-Codierung gehen zu entscheiden, diese Bibliothek finden Sie unter: http://utfcpp.sourceforge.net /

Es kann Ihr Leben viel einfacher machen.

Ich habe eine weit verbreitete Anwendung tatsächlich geschrieben (5million + User) so verwendet jedes Kilobyte aufaddiert, buchstäblich. Trotz, dass ich wxString gerade stecken. Ich habe es so konfiguriert von std :: wstring abgeleitet werden, so kann ich sie Funktionen übergeben einen wstring konst erwartet &.

Bitte beachten Sie, dass std :: wstring stammt Unicode auf dem Mac (kein UTF-16 benötigt für Zeichen über U + 10000), und daher verwendet es 4 Byte / wchar_t. Der große Vorteil dabei ist, dass i ++ bekommt man das nächste Zeichen, immer. Auf Win32, das ist in nur 99,9% der Fälle wahr. Als Stipendiatin Programmierer, Sie werden verstehen, wie wenig 99,9%.

Aber wenn Sie nicht überzeugt sind, schreibt die Funktion, ein std :: string in Großbuchstaben [UTF-8] und ein std :: wstring. Diese zwei Funktionen werden Ihnen sagen, welche Art und Weise Wahnsinn ist.

Ihre On-Disk-Format ist eine andere Sache. Für Portabilität sollte, dass UTF-8 sein. Es gibt keine endianness Sorge in UTF-8, noch eine Diskussion über die Breite (2/4). Dies kann, warum viele Programme erscheinen UTF-8 verwenden.

Auf einer leicht in keinem Zusammenhang zur Kenntnis, lesen Sie oben auf Unicode-String comparisions und Normalisierung. Oder Sie werden mit dem gleichen Fehler wie .NET am Ende, wo Sie zwei Variablen können foo und FOO unterscheiden sich nur in (unsichtbar) Normalisierung.

MicroATX ist so ziemlich ein Standard-PC-Motherboard-Format, die meisten der Lage, 4-8 GB RAM. Wenn Sie sprechen picoATX vielleicht sind Sie beschränkt sich auf 1-2 GB RAM. Auch dann ist das viel für eine Entwicklungsumgebung. Ich würde immer noch mit UTF-8-Stick für oben genannten Gründe, aber Speicher soll nicht Ihr Anliegen.

Von dem, was ich gelesen habe, dann ist es besser, eine 16-Bit-Codierung intern zu verwenden, wenn Sie auf dem Gedächtnis kurz sind. Sie paßt fast alle lebenden Sprachen in einem Zeichen

ich auch unter ICU . Wenn Sie nicht sein mit bestimmten STL-Funktionen von Strings gehen, die ICU String-Typen verwenden könnte für Sie besser sein.

Haben Sie mit wxStrings in Betracht gezogen? Wenn ich mich richtig erinnere, was sie tun können utf-8 <->. Unicode-Konvertierungen, und es wird es einfacher, etwas machen, wenn Sie Zeichenfolgen zu und von der UI passieren müssen

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top