Was ist eine “breite Zeichenkette” in der Sprache C?

Lesezeit: 3 Minuten

Benutzer-Avatar von Quantum231
quanten231

Ich bin in dem Buch darauf gestoßen:

wscanf(L"%lf", &variable);

wobei der erste Parameter vom Typ ist wchar_t *.

Das ist anders als scanf("%lf", &variable); wobei der erste Parameter vom Typ ist char *.

Was ist also der Unterschied zu. Ich habe noch nie “breite Zeichenkette” gehört. Ich habe etwas namens Raw String Literals gehört, das die Zeichenfolge so druckt, wie sie ist (keine Notwendigkeit für Dinge wie Escape-Sequenzen), aber das war nicht in C.

  • Fang hier an joelonsoftware.com/articles/Unicode.html

    – Martin Beckett

    2. Juli 2012 um 2:29 Uhr

  • Der erste Parameter ist tatsächlich vom Typ wchar_t []subtil anders als wchar_t *.

    – Traumlax

    2. Juli 2012 um 2:31 Uhr

Benutzeravatar von Jerry Coffin
Jerry Sarg

Das genau Die Natur von Breitzeichen wird (absichtlich) von der linken Implementierung definiert.

Als sie zum ersten Mal das Konzept von erfanden wchar_t, ISO 10646 und Unicode konkurrierten immer noch miteinander (während sie jetzt meistens kooperieren). Anstatt zu dekretieren, dass ein internationales Zeichen das eine oder andere (oder möglicherweise etwas ganz anderes) sein würde, stellten sie einfach einen Typ (und einige Funktionen) bereit, den die Implementierung definieren konnte, um internationale Zeichensätze nach ihrer Wahl zu unterstützen.

Verschiedene Implementierungen haben übte dieses Variationspotential aus. Wenn Sie beispielsweise den Compiler von Microsoft unter Windows verwenden, wchar_t wird ein 16-Bit-Typ sein, der UTF-16-Unicode enthält (ursprünglich enthielt er UCS-2-Unicode, aber das ist jetzt offiziell veraltet).

Unter Linux, wchar_t wird häufiger ein 32-Bit-Typ sein, der UCS-4/UTF-32-codierten Unicode enthält. Portierungen von gcc auf zumindest einige andere Betriebssysteme tun dasselbe, obwohl ich nie versucht habe zu bestätigen, dass dies immer der Fall ist.

Eine Garantie dafür gibt es jedoch nicht. Zumindest theoretisch könnte eine Implementierung unter Linux 16 Bit verwenden, oder eine unter Windows könnte 32 Bit verwenden, oder man könnte sich entscheiden, 64 Bit zu verwenden (obwohl ich ein wenig überrascht wäre, das in der Realität zu sehen).

Auf jeden Fall die allgemeine Vorstellung davon, wie die Dinge sind beabsichtigt zu arbeiten, ist das eine einzige wchar_t reicht aus, um einen Codepunkt darzustellen. Für E/A sollen die Daten von der externen Darstellung (was auch immer es ist) in konvertiert werden wchar_ts, was sie relativ leicht manipulierbar machen (soll). Während der Ausgabe werden sie dann wieder in die Codierung Ihrer Wahl umgewandelt (die sich möglicherweise von der gelesenen Codierung unterscheidet).

  • Was ist mit anderen Nicht-Linux-Unix? Ist dies nicht auch eine Eigenschaft von glibc und nicht von linux?

    – Guter Mensch

    19. Dezember 2013 um 18:23 Uhr

  • Wie gesagt, nein, dafür gibt es keine Garantie: “Theoretisch könnte eine Implementierung unter Linux 16 Bit verwenden”. Soweit Nicht-Linux-Unix geht, habe ich in letzter Zeit nicht genug nachgesehen, um einen intelligenten Kommentar abzugeben.

    – Jerry Sarg

    21. Dezember 2013 um 18:13 Uhr


Benutzeravatar von Chris Dargis
Chris Dargis

“Wide Character String” bezieht sich auf die Codierung der Zeichen in der Zeichenfolge.

Aus Wikipedia:

Ein Breitzeichen ist ein Computerzeichen-Datentyp, der im Allgemeinen größer ist als das herkömmliche 8-Bit-Zeichen. Die erhöhte Datentypgröße ermöglicht die Verwendung größerer codierter Zeichensätze.

UTF-16 ist eine der am häufigsten verwendeten Wide-Character-Kodierungen.

Des Weiteren, wchar_t ist definiert durch Microsoft als ein unsigned short(16-bit) Datenobjekt. Dies könnte und ist höchstwahrscheinlich eine andere Definition in anderen Betriebssystemen oder Sprachen.

Entnommen aus dem Wikipedia-Artikel aus dem Kommentar unten:

„Die Breite von wchar_t ist Compiler-spezifisch und kann so klein wie 8 Bit sein. Folglich sollten Programme, die über jeden C- oder C++-Compiler portierbar sein müssen, wchar_t nicht zum Speichern von Unicode-Text verwenden. Der Typ wchar_t ist zum Speichern von Compiler- definierte Breitzeichen, die in manchen Compilern Unicode-Zeichen sein können.”

  • Laut Wikipedia ist es nicht tragbar: en.wikipedia.org/wiki/Wide_character

    – nhahtdh

    2. Juli 2012 um 2:35 Uhr

  • @ quantum231, die Wiki-Antwort gilt wirklich nur für MSFT. Lesen Sie Jerrys Antwort und den Joel-Blogbeitrag

    – Martin Beckett

    2. Juli 2012 um 3:54 Uhr

1395210cookie-checkWas ist eine “breite Zeichenkette” in der Sprache C?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy