Lokalisierung von Zeichenketten




Lokalisierung von Zeichenketten in C ++

Die überwiegende Anzahl der Codebeispiele mit C / C ++ Strings (in allen veröffentlichten Quellen) Es arbeitet mit Null-terminalen Arrays (ASCIZ) Elemente char (im Stil von C), oder Behältertyp String (im Stil von C ++), als ein Add-on solchen Anordnungen gebaut. All dies funktioniert wunderbar mit Streichern Latein (Englisch) Zeichen, aber Rennen auf Linien gehen, enthält Symbole der Fremdsprache Alphabete (Russisch, Chinesisch, Arabisch und Hebräisch). Es ist nicht so einfach ... und sehr schlecht in der Literatur beschrieben, das ist verständlich: Englisch sprechende Autoren zahlen wenig Aufmerksamkeit auf Fragen der Fremdsprache Lokalisierung, und inländische Autoren, meistens, Umschreiben und die englischsprachigen Publikationen Anpassung, zahlen keine Aufmerksamkeit auf diesen Aspekt der Frage.

C-Sprache - eine sehr alte Programmiersprache, und C ++ erbt von Formaten und es begrenzt durch die Anforderungen der syntaktischen Kompatibilität mit C. zu, nicht eine C / C ++ Problem mit solchen Linien zu haben, (genannt lokalisierte) Sie müssen verstehen, was mit diesen Lokalisierungen vor sich geht ...

historisch, Symbole (verkohlen) eingereicht (1963 Jahr) ASCII-Standard als jüngere 7 Bits eines Bytes, während Senior 8. Bit zur Fehlerkontrolle bestimmt, trat während der Datenübertragung. Diese Codierung ermöglicht es Ihnen, alle möglichen zu kodieren 128 verschiedene Symbole, und diese Zahl ist kaum genug, um die Zeichen des englischen Alphabets (groß und klein), digital (Code 0x30-0x39), Manager (weniger Code 0x20) und Sonderzeichen. Wenn es um die Übermittlung der nationalen Alphabete, Geben Sie die alternative Zeichentabelle, wie KOI-7 für die russische Sprache. Der Wechsel zu einem Strom Eingabe-Ausgabe-Tabelle für alternatives Symbol für Symbol mit Code 0x18 (Code aufgerufen: Gerätesteuerung 2) in dem Strom, und Rückkehr in die ASCII-Haupttabelle - das Symbol mit dem Code 0x17 (Gerätesteuerung 1).

später, seit Mitte der 80er Jahre, mit der Zeit IBM PC weit verbreitet und ihnen andere Familien von Computern ersetzen, ASCII-Standard wurde durch das achte Bit-Byte Zeichen erweitert, Byte darstellen könnte 256 Zeichen: junior 127 stellt die ursprüngliche ASCII-Tabelle (mit lateinischer Schrift), und älter - nationale Alphabet. aber, da die nationalen Alphabete können vielfältig sein, jeder von ihnen wurde zur Unterstützung benötigt, um eine Codepage eingeben, beispielsweise, für die russische Sprache, könnte dies die Seite CP-866 sein (MS в), CP-1251 (в Windows-), No-8R (в UNIX, Linux) - und jede dieser Seiten bietet ihren, gekennzeichnet durch andere, die Reihenfolge der russischen Zeichen. Dabei, für die korrekte Darstellung (oder Decodieren) jede lokalisierte Zeichenfolge ist es notwendig, die Codepage zu wissen, wie es präsentiert wird.

zu, ein Ende dieser Babel der Sprachcode-Seiten zu setzen, Es wurde vorgeschlagen, (1991Stadt) Darstellung UNICODE Standard, in dem das Codiersystem wird jedes Zeichen 32-Bit-Wert codiert (4 Byte, aber nicht alle 32-Bit-Werte gelten). Dieser Standard ermöglicht es Ihnen, eine große Anzahl von Zeichen verschiedenen Schriftsysteme zu codieren. Unterlagen, Standard codierte UNICODE, kann aus einem einzigen Text japanische und chinesische Schriftzeichen, lateinische Buchstaben, kyrillisch, griechisches Alphabet (ein, e, ich, Fr., p, l, F, Oh ...), mathematische Symbole, Musiknotation, musikalische Symbole, Symbole ausgestorben, selten, exotische Völker. Es gibt keine Notwendigkeit, die Codepage wechseln. beispielsweise, Hier sind die einige der Symbole der Sprache, die als “singaliskii”:

Der erste UNICODE-Standard wurde im 91. Jahr veröffentlicht. Last zur Zeit - in 2017 und er beschreibt 136755 verschiedene Symbole.

Aber UNICODE - ist nach wie vor nur Standard-Darstellung der einzelnen Zeichen. Zur Darstellung dieses Zeichens in einem bestimmten Betriebssystem (oder die Programmiersprache) brauchen mehr Charakter Codierungssystem UNICODE.

  • Codierungssystem ist weit verbreitet:
    UTF-32 - verwendet, um jedes Zeichen darzustellen 4 Byte, direkter Zahlenwert UNICODE-Code
  • UTF-32 - repräsentieren die am häufigsten verwendeten Symbole verwendet 2 Byte (zuerst 65536 Positionen), und der Rest ist in der Form eines „Surrogat pairs“. Diese Codierung wird unter Windows-Betriebssystemen verwendet, beginnend mit Windows NT.
  • UTF-32 - zur Darstellung jedes Zeichens verwendet eine variable Länge Bytefolge: von 1 Byte für das ASCII-Zeichen von der Haupttabelle, zu 6 Byte für selten verwendete Zeichen (Russische Alphabet Zeichen mit 2 Bytes codiert). Diese Codierung wurde später als andere Betriebssysteme für Plan erstellt 9 und Inferno 1992. Ken Thompson und Robert Pike mit Kollegen, und trat als einzige und Bulk-Codierung von Zeichenketten in späteren Python Programmiersprachen und Go. Diese Codierung wird verwendet,, Heute überall, in den POSIX / UNIX-Betriebssysteme, Linux.

Zurückkommend auf die, dass C / C ++ alte Familie von Programmiersprachen, vertreten sie in lokalisierten Zeichen notwendig, einen neuen Datentyp einzuführen - breite Zeichen Wchar_t statt char (die Art der Daten, erschien in dem C89-Standard, aber, vollständig mit API-Unterstützung, Nur in dem C99-Standard). Anstelle der Linie C der Formularbibliothek Funktionen str *() für breite ihre volle Pendants bieten, aber als wcs *() (anstelle des Präfix Präfix str Schreib wcs). Verschiedene Systeme können unterschiedliche Wchar_t Bit haben (in Linux ist int32_t, в Windows-int16_t) aber für einen Programmierer, dass die Materie nicht und schafft keine Unterschiede.

in C / C ++ eingeführt Familie von Funktionen mb aufgezeichnet Mehrbyte-Sequenzen in UTF-8-Kodierung für die Arbeit und die Umwandlung *(): mbtowc(), mblen(), mbstowcs(), wcstombs() usw. Es ist ein Mechanismus zur gegenseitigen Umwandlung zwischen char array[] (die ausgedrückt auch UTF-8-Strings) и wchar_t[]. Wenn Sie nicht mit UTF-8-Codierung konfrontiert (das geschieht wahrscheinlich in Windows), diese Gruppe von Funktionen, dann sollten Sie nicht nehmen.

Ähnlich, stattdessen Container-Klasse C ++ String-Klasse eingeführt, um ein ähnlicher Behälter breite Zeichen wstring.

Insbesondere über die Technik von Wide lokalisierten Strings werden im nächsten Artikel behandelt werden. In der Zwischenzeit des ersten elementare Beispiel ... ohne Kommentar - als Anlass zum Nachdenken (beachten und erklären,, dass calling strlen() jeweils gibt die Anzahl von Bytes in einem String nicht konsistent visuell offensichtlich Anzahl der Buchstaben ist):

P.S. Mit sehr ausführlich über die Lokalisierung in C / C ++ und den lokalisierten Strings, die sind näher interessiert, können Sie hier lesen: Sprache Lokalisierung des C / C ++ Sprache Lokalisierung des C / C ++ - gibt es eine Erklärung mehr 22 Seiten Bürodokumentenformate.

Newsletter neue Lektionen über die Programmierung:

Lokalisierung von Zeichenketten
5 (100%) 2 Stimmen

Etwa Öl

praktische Erfahrungen über die Softwareentwicklung 40 Jahre. Lehrer Globale Logik internationales Softwareunternehmen. IBM Developer Works Permanent Autor von Publikationen. Wissenschaftliche Herausgeber der Computerliteratur-Verlag "Symbol-Plus", Sankt Petersburg.

2 Gedanken zu "Lokalisierung von Zeichenketten

  1. Некоторые особенности работы с русскоязычными строками, которые не описываются обычно при рассмотрении строк char, будут рассмотрены в следующих статьях в продолжение этой темы.
    Следите

  2. Я так понимаю в текст вкралась опечатка, и речь идет о последовательности UTF-8, 16 und 32

Hinterlasse eine Antwort

Deine Email-Adresse wird nicht veröffentlicht. erforderliche Felder sind markiert *