Frage

Wir haben eine Reihe von Anwendungen, die für den ASCII-Zeichensatz entwickelt wurden. Nun, wir versuchen es in Island zu installieren und laufen in Probleme, bei denen die isländischen Zeichen werden immer vermasselt.

Wir arbeiten durch unsere Probleme, aber ich habe mich gefragt: Gibt es einen guten „Führer“ da draußen für das Schreiben von C ++ Code, der für 8-Bit-Zeichen ausgelegt ist, und die ordnungsgemäß funktionieren, wenn UTF-8-Daten, die ihn gegeben ist ?

Ich kann nicht erwarten, dass jeder den ganzen Unicode-Standard zu lesen, aber wenn es etwas besser verdaulich vorhanden ist, würde Ich mag es, mit dem Team teilen, damit wir nicht wieder in diese Probleme laufen.

Re-Schreiben alle Anwendungen zu verwenden wchar_t oder eine andere String-Darstellung ist in dieser Zeit nicht möglich. Ich werde auch beachten, dass diese Anwendungen kommunizieren über Netzwerke mit Servern und Geräten, die 8-Bit-Zeichen verwenden, so dass selbst wenn wir intern Unicode haben, würden wir immer noch an den Grenzen mit Übersetzungsprobleme haben. Zum größten Teil sind diese Anwendungen nur Daten passieren um; sie es nicht tun „Prozess“ der Text in irgendeiner Art und Weise, als es von Ort zu Ort zu kopieren.

Die Betriebssysteme sind Windows und Linux. Wir verwenden std :: string und Klar alten C-Strings. (Und fragen Sie mich nicht eine der Design-Entscheidungen zu verteidigen. Ich versuche nur das Chaos zu helfen zu beheben.)


Hier ist eine Liste von dem, was vorgeschlagen wurde:

War es hilfreich?

Lösung

Das sieht aus wie eine umfassende Kurzanleitung:
http://www.cl.cam.ac.uk/~mgk25/ unicode.html

Andere Tipps

Seien Sie einfach 8-Bit-sauber, zum größten Teil. Allerdings müssen Sie sich bewusst sein müssen, dass jede Nicht-ASCII-Zeichen über mehrere Bytes aufteilt, so müssen Sie diesem Umstand Rechnung, wenn Zeilenumbrüche nehmen oder Text für die Anzeige Kürzen.

UTF-8 hat den Vorteil, dass Sie immer sagen können, wo Sie in einem Multi-Byte-Zeichen sind: wenn Bit 7 gesetzt ist und Bit 6 Reset (Byte ist 0x80-0xBF) ist dies ein nachfolgender Byte, während, wenn die Bits 7 und 6 eingestellt und 5 zurückgesetzt (0xC0-0xDF) es ist ein führendes Byte mit einem nacheilenden Byte; wenn 7, 6 und 5 eingestellt sind und 4 zurückgesetzt (0xE0-0xEF) ist es ein führendes Byte mit zwei nachläufen Bytes, und so weiter. Die Anzahl von aufeinanderfolgenden Bits am höchstwertigen Bit gesetzt ist, die Gesamtzahl der Bytes, die die Zeichen bilden. Das heißt:

110x xxxx = Zwei-Byte-Zeichen
1110 xxxx = Drei-Byte-Zeichen
1111 0xxx = Vier-Byte-Zeichen
etc

Das isländische Alphabet all in ISO 8859-1 enthalten ist und daher von Windows-1252. Wenn dies eine Konsole-Modus-Anwendung ist, beachten Sie, dass die Konsole IBM Codepages verwendet, so (je nach System locale) könnte es in 437, 850 oder 861 . Windows hat keine nativen Display-Unterstützung für UTF-8; Sie müssen in UTF-16-Transformation und Unicode-APIs verwenden.

Beim SetConsoleCP und SetConsoleOutputCP Angabe Codepage 1252, wird mit Ihrem Problem helfen, wenn es sich um eine Konsole-Modus-Anwendung ist. Leider wählte die Konsolen-Schriftart hat eine Schriftart sein, die die Codepage unterstützt, und ich kann nicht einen Weg, um den Schriftart sehen. Die Standard-Bitmap-Schriften nur die System-Standard-OEM-Codepage unterstützen.

Bitte beachten Sie, dass die vollständige Unicode nicht in 16-Bit-Zeichen paßt; so verwendet entweder 32-Bit-Zeichen oder variabler Breite Kodierung (UTF-8 ist die beliebteste).

UTF-8 wurde entwickelt, um genau mit Ihren Problemen im Auge behalten. Eine Sache, die ich vorsichtig sein würde, ist, dass ASCII ist wirklich eine 7-Bit-Codierung, so dass, wenn ein Teil der Infrastruktur ist das 8.e Bit für andere Zwecke verwendet wird, das schwierig sein kann.

Vielleicht möchten check out icu . Sie könnten Funktionen zur Verfügung, die mit UTF-8-Zeichenketten machen die Arbeit leichter wäre.

Isländisch verwendet ISO Latin 1, so acht Bits sollte ausreichen. Wir brauchen mehr Details, um herauszufinden, was los ist.

Isländisch, wie Französisch, Deutsch, und die meisten anderen westeuropäischen Sprachen, kann ein 8-Bit-Zeichensatz (CP1252 unter Windows, ISO 8859-1 aka Latin1 auf * x) unterstützt werden. Dies war der Standardansatz vor Unicode erfunden wurde, und ist nach wie vor weit verbreitet. Wie Sie sagen, haben Sie eine Einschränkung, die Sie nicht Ihre App nutzen wchar neu schreiben können, und Sie brauchen nicht zu tun.

Sie sollten nicht überrascht sein, dass UTF-8 Probleme verursacht; UTF-8 codiert die Nicht-ASCII-Zeichen (zum Beispiel der akzentuierte lateinischen Buchstaben, Dorn, eth, usw.) als jeweils zwei Bytes.

Die einzigen allgemeinen Ratschläge, die gegeben werden können, sind ganz einfach (in der Theorie): (1) entscheiden, welche Zeichensatz unterstützen wollen (Unicode, Latin1, CP1252, ...) in Ihrem System (2) Wenn Daten in einer anderen Art und Weise kodiert zugeführt werden (beispielsweise UTF-8) dann umcodieren es zu einem Standard (z.B. CP1252) an der Systemgrenze (3), wenn Sie benötigen, um Daten in einer anderen Art und Weise verschlüsselt zu liefern, ...

Sie möchten breite Zeichen verwenden (wchar_t statt char und std :: wstring statt std :: string). Dies gilt nicht automatisch 100% Ihrer Probleme zu lösen, ist aber guter erster Schritt.

Verwenden Sie auch String-Funktionen, die Unicode-aware sind (auf die Dokumentation beziehen). Wenn etwas breite Zeichen oder String manipuliert im Allgemeinen es ist bekannt, dass sie breit sind.

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