<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[[C++0x] Welche Strings soll man denn nun verwenden?]]></title><description><![CDATA[<p>Guten Abend liebe Community,</p>
<p>Ich beschäftige mich gerade ein wenig mit dem Thema der Strings in C++0x, und dabei bin ich ein wenig stutzig geworden. Ich habe mir die Frage gestellt, welche Art von Strings man in seinen Programmen benutzen sollte. Bisher habe ich unwissend immer schwer in Richtung <code>wstring</code> s und <code>wchar_t</code> tendiert, was ja scheinbar eine schlechte Sache ist, weil es nicht genau definiert ist. Java und .NET verwenden bekanntlich für alles UTF-16, bei C++ weiss man es bisher nicht so genau.</p>
<p>Nun kommen aber im neuen Standard neue String- und Character-Typen dazu. Genannt seien hier einmal die Unicode-Konsorten <code>char16_t</code> und <code>char32_t</code> , sowie <code>u16string</code> und <code>u32string</code> . Da jedoch scheinbar im neuen Standard bewusst auf eine Bereitstellung einer vollständigen Unicode-Collation verzichtet wird, funktionieren die Funktionen der Klassen nicht immer wie erwartet.</p>
<p>Beispielsweise wird die Member-Funktion <code>length</code> bei <code>u16string</code> die Anzahl der <code>char16_t</code> -Entitäten (was für ein grauenhaftes Wort) im String zurückgeben, was aber nicht der Länge des Strings entsprechen muss (hierfür müsste der Standard definieren, wie die Hersteller die sog. grapheme clusters berechnen können, soweit ich es verstanden habe). Das einzige, was scheinbar gut funktioniert, ist das Einlesen und Schreiben von Unicode mittels Streams und <code>codecvt</code> .</p>
<p>Zusammengefasst zu meiner Frage: Wenn man die neuen Typen nicht richtig nutzen kann, was bringen sie mir denn innerhalb meines Programms? Gehe ich richtig in der Annahme, dass es sowieso nicht gedacht ist, Unicode programmintern zu verwenden, und dass man wie gewohnt auf normale <code>string</code> s und <code>char</code> s setzen sollte?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/286870/c-0x-welche-strings-soll-man-denn-nun-verwenden</link><generator>RSS for Node</generator><lastBuildDate>Thu, 20 Aug 2026 18:15:09 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/286870.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 17 May 2011 22:37:15 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to [C++0x] Welche Strings soll man denn nun verwenden? on Tue, 17 May 2011 22:37:15 GMT]]></title><description><![CDATA[<p>Guten Abend liebe Community,</p>
<p>Ich beschäftige mich gerade ein wenig mit dem Thema der Strings in C++0x, und dabei bin ich ein wenig stutzig geworden. Ich habe mir die Frage gestellt, welche Art von Strings man in seinen Programmen benutzen sollte. Bisher habe ich unwissend immer schwer in Richtung <code>wstring</code> s und <code>wchar_t</code> tendiert, was ja scheinbar eine schlechte Sache ist, weil es nicht genau definiert ist. Java und .NET verwenden bekanntlich für alles UTF-16, bei C++ weiss man es bisher nicht so genau.</p>
<p>Nun kommen aber im neuen Standard neue String- und Character-Typen dazu. Genannt seien hier einmal die Unicode-Konsorten <code>char16_t</code> und <code>char32_t</code> , sowie <code>u16string</code> und <code>u32string</code> . Da jedoch scheinbar im neuen Standard bewusst auf eine Bereitstellung einer vollständigen Unicode-Collation verzichtet wird, funktionieren die Funktionen der Klassen nicht immer wie erwartet.</p>
<p>Beispielsweise wird die Member-Funktion <code>length</code> bei <code>u16string</code> die Anzahl der <code>char16_t</code> -Entitäten (was für ein grauenhaftes Wort) im String zurückgeben, was aber nicht der Länge des Strings entsprechen muss (hierfür müsste der Standard definieren, wie die Hersteller die sog. grapheme clusters berechnen können, soweit ich es verstanden habe). Das einzige, was scheinbar gut funktioniert, ist das Einlesen und Schreiben von Unicode mittels Streams und <code>codecvt</code> .</p>
<p>Zusammengefasst zu meiner Frage: Wenn man die neuen Typen nicht richtig nutzen kann, was bringen sie mir denn innerhalb meines Programms? Gehe ich richtig in der Annahme, dass es sowieso nicht gedacht ist, Unicode programmintern zu verwenden, und dass man wie gewohnt auf normale <code>string</code> s und <code>char</code> s setzen sollte?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2064973</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2064973</guid><dc:creator><![CDATA[*rant*]]></dc:creator><pubDate>Tue, 17 May 2011 22:37:15 GMT</pubDate></item><item><title><![CDATA[Reply to [C++0x] Welche Strings soll man denn nun verwenden? on Wed, 18 May 2011 00:25:07 GMT]]></title><description><![CDATA[<p>Ach ja, Unicode mit C++ ist und bleibt eine Krux - jedenfalls in der Theorie, in der Praxis funktioniert das Ganze ja erstaunlich gut. Zusammengesetzte vs Decomposed Characters, vier Normalformen, das Rechts-Nach-Links-Zeug und alleine das Vergleichen von Strings ist ein Wahnsinn. Java und .NET verwenden afaik übrigens UCS-2 (also fix 16 Bit pro Code Point, bei UTF-16 sind's 2 oder 4 Byte).</p>
<p>Da muss man also pragmatisch rangehen.</p>
<p>Zu deinen Fragen im letzten Absatz: Man kann ja auch jetzt halbwegs mit std::wstring arbeiten. Klar hat man keine definierten Größen und macht keine Checks auf verquere Chars im String, verzichtet auf Normalformen usw aber trotzdem klappt's ja. In der Regel. Mit den neuen Typen wird sich da imo nicht viel ändern, außer ein wenig anfänglicher Verwirrung.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2064982</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2064982</guid><dc:creator><![CDATA[fdfdg]]></dc:creator><pubDate>Wed, 18 May 2011 00:25:07 GMT</pubDate></item><item><title><![CDATA[Reply to [C++0x] Welche Strings soll man denn nun verwenden? on Wed, 18 May 2011 06:29:58 GMT]]></title><description><![CDATA[<p>Ich sag msl so: Mit UTF-8 kommt auch ein normaler char-String zurecht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2065004</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2065004</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Wed, 18 May 2011 06:29:58 GMT</pubDate></item><item><title><![CDATA[Reply to [C++0x] Welche Strings soll man denn nun verwenden? on Wed, 18 May 2011 07:43:01 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<p>Ich sag msl so: Mit UTF-8 kommt auch ein normaler char-String zurecht.</p>
</blockquote>
<p>Sind 256 mögliche Zeichen = früherer ASCII-Standard? Es gab auch mal die Hälfte mit 128 Zeichen und hatte auch gereicht. UTF-8 Sollte für die meisten Dinge voll reichen. Oder man will etwas mit z.B. chinesischem Text oder sogar mehrsprachiges. Dann kann man immer noch weiter nachdenken!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2065036</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2065036</guid><dc:creator><![CDATA[berniebutt]]></dc:creator><pubDate>Wed, 18 May 2011 07:43:01 GMT</pubDate></item><item><title><![CDATA[Reply to [C++0x] Welche Strings soll man denn nun verwenden? on Wed, 18 May 2011 07:48:34 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<p>Ich sag msl so: Mit UTF-8 kommt auch ein normaler char-String zurecht.</p>
</blockquote>
<p>Aber length()/strlen() für einen String mit Umlauten liefert z.B. die Anzahl der Bytes aber nicht die Anzahl der Zeichen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2065042</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2065042</guid><dc:creator><![CDATA[manni66]]></dc:creator><pubDate>Wed, 18 May 2011 07:48:34 GMT</pubDate></item><item><title><![CDATA[Reply to [C++0x] Welche Strings soll man denn nun verwenden? on Wed, 18 May 2011 08:32:14 GMT]]></title><description><![CDATA[<p>Verstehe ich so alles nicht! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /></p>
<pre><code class="language-cpp">char text[20];        // ASCII
int len;
strcpy(text,&quot;äöü&quot;);   // Text reinsetzen
len = strlen(text);   // liefert 3 was sonst?
</code></pre>
<p>Was soll ich mich mit Unicode etc. herumschlagen, wenn ich es nicht notwendig brauche? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /> Ist allerdings native C ohne die Stringklasse von C++.<br />
Reicht meist völlig aus. Es sei denn wir haben hier wieder die nie endende Diskussion C versus C++. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2065079</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2065079</guid><dc:creator><![CDATA[berniebutt]]></dc:creator><pubDate>Wed, 18 May 2011 08:32:14 GMT</pubDate></item><item><title><![CDATA[Reply to [C++0x] Welche Strings soll man denn nun verwenden? on Wed, 18 May 2011 09:07:08 GMT]]></title><description><![CDATA[<blockquote>
<p>// liefert 3 was sonst?</p>
</blockquote>
<p>Es könnte auch etwas vollkommen anderes liefern, da bei UTF8 nunmal ein Zeichen mit einer variablen Anzahl Bytes kodiert wird.<br />
Wenn text vom Benutzer eingeben wird und dieser chinesische Schriftzeichen verwendet, dürfte etwas anderes dabei herauskommen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2065098</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2065098</guid><dc:creator><![CDATA[Irgendwer]]></dc:creator><pubDate>Wed, 18 May 2011 09:07:08 GMT</pubDate></item><item><title><![CDATA[Reply to [C++0x] Welche Strings soll man denn nun verwenden? on Wed, 18 May 2011 09:11:52 GMT]]></title><description><![CDATA[<p>berniebutt schrieb:</p>
<blockquote>
<p>Verstehe ich so alles nicht! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /></p>
<pre><code class="language-cpp">char text[20];        // ASCII
int len;
strcpy(text,&quot;äöü&quot;);   // Text reinsetzen
len = strlen(text);   // liefert 3 was sonst?
</code></pre>
<p>Was soll ich mich mit Unicode etc. herumschlagen, wenn ich es nicht notwendig brauche?</p>
</blockquote>
<p>Problem ist, dass du hier wahrscheinlich Latin-1 oder Latin-2 verwendest. In UTF-8 wäre der String 6 Bytes lang, weil ä, ö und ü ausserhalb des 7 Bit Bereichs von ASCII sind. Theoretisch wäre es sogar möglich, dass er noch länger wäre, weil man ä, ö und ü auch als a, o und u mit jeweils einem Trema schreiben kann.</p>
<p>Wieso du dich mit Unicode herumschlagen sollst? Sobald du deine Applikation in die weite Welt hinausbringen willst und Übersetzungen anbieten möchtest, hast du ein riesen Problem, wenn du nicht vorher an Unicode gedacht hast.</p>
<p>fdfdg schrieb:</p>
<blockquote>
<p>Java und .NET verwenden afaik übrigens UCS-2 (also fix 16 Bit pro Code Point, bei UTF-16 sind's 2 oder 4 Byte).</p>
</blockquote>
<p>.Net verwendet UTF-16, bzw. zum Teil sogar UTF-8.<br />
<a href="http://msdn.microsoft.com/en-us/library/9b1s4yhz.aspx" rel="nofollow">http://msdn.microsoft.com/en-us/library/9b1s4yhz.aspx</a></p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2065102</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2065102</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Wed, 18 May 2011 09:11:52 GMT</pubDate></item><item><title><![CDATA[Reply to [C++0x] Welche Strings soll man denn nun verwenden? on Wed, 18 May 2011 09:40:21 GMT]]></title><description><![CDATA[<p>berniebutt schrieb:</p>
<blockquote>
<p>SeppJ schrieb:</p>
<blockquote>
<p>Ich sag msl so: Mit UTF-8 kommt auch ein normaler char-String zurecht.</p>
</blockquote>
<p>Sind 256 mögliche Zeichen = früherer ASCII-Standard? Es gab auch mal die Hälfte mit 128 Zeichen und hatte auch gereicht. UTF-8 Sollte für die meisten Dinge voll reichen. Oder man will etwas mit z.B. chinesischem Text oder sogar mehrsprachiges. Dann kann man immer noch weiter nachdenken!</p>
</blockquote>
<p>Du denkst UTF-8 == 256 Zeichen, oder? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /><br />
Wirf mal einen Blick in die Wiki und ignoriere das Thema nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2065119</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2065119</guid><dc:creator><![CDATA[Britney Spears]]></dc:creator><pubDate>Wed, 18 May 2011 09:40:21 GMT</pubDate></item><item><title><![CDATA[Reply to [C++0x] Welche Strings soll man denn nun verwenden? on Wed, 18 May 2011 10:13:04 GMT]]></title><description><![CDATA[<p>Britney Spears schrieb:</p>
<blockquote>
<p>Du denkst UTF-8 == 256 Zeichen, oder? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /><br />
Wirf mal einen Blick in die Wiki und ignoriere das Thema nicht.</p>
</blockquote>
<p>Das Thema sollte man wirklich nicht ignorieren, wenn man mehr vorhat oder seine Applikation weltweit verbreiten möchte!<br />
Aber für den Hausgebrauch oder einen Anwender im gleichen Srachgebiet? Wozu das Leben unnötig schwer machen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /><br />
Ging doch alles und geht noch mit 256 verfügbaren Zeichen (ASCII) mit native C! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /></p>
<p>Könnt ihr euch am Thema austoben, meinetwegen.<br />
daddeldu! :p</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2065150</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2065150</guid><dc:creator><![CDATA[berniebutt]]></dc:creator><pubDate>Wed, 18 May 2011 10:13:04 GMT</pubDate></item><item><title><![CDATA[Reply to [C++0x] Welche Strings soll man denn nun verwenden? on Wed, 18 May 2011 14:00:09 GMT]]></title><description><![CDATA[<p>berniebutt schrieb:</p>
<blockquote>
<pre><code class="language-cpp">char text[20];        // ASCII
</code></pre>
</blockquote>
<p>Eine char-Variable kann zumindest ASCII Codes speichern, da char mindenestens Werte im Bereich 0-127 speichern kann. Ob nun aber ein 'A' wirklich dem Wert 65 (siehe ASCII-Tabelle) entspricht, ist gar nicht festfelegt!</p>
<p>Was Du in einem char speicherst, ist Dir und dem System überlassen. Der Sprache C++ ist das egal, was das genau ist. Der Quelltext besteht aus Zeichen des &quot;basic source character sets&quot; wobei die Kodierung nicht festgelegt ist:</p>
<blockquote>
<p>The basic source character set consists of 96 characters: the space character, the control characters representing horizontal tab, vertical tab, form feed, and new-line, plus the following 91 graphical characters:</p>
<pre><code>abcdefghijklmnopqrstuvwxyz
ABCDEFGHIJKLMNOPQRSTUVWXYZ
0123456789
_{}[]#()&lt;&gt;%:;.?*+-/^&amp;|~!=,\&quot;'
</code></pre>
</blockquote>
<p>Schreibt man im Quelltext beispielsweise 'K' hin, so soll der Compiler dieses Literal durch einen zugehörigen Zahlenwert des sogenannten &quot;excecution character set&quot; ersetzten. Das muss meines Wissens nach nicht ASCII sein und ist eben systemabhängig bzw implementation-defined.</p>
<p>Mit C++11 bekommen wir aber neue character-Typen und auch neue Literale. So ist beispielsweise u'K' ein Literal vom Typ char16_t und der numerische Wert ergibt sich anhand ISO 10646 (UCS, universal character set). Und ein großes U als Präfix, also U'K' ist ein Literal vom Typ char32_t wobei der numerische Wert der entsprechende Unicode ist.</p>
<p>Dementsprechend gibt es auch String-Literale, die mit einem kleinen u oder einem großen U anfangen. Ein Stringliteral, was mit einem kleinen u anfängt, entspricht der UTF-16 Kodierung, weil der Compiler aus einem Zeichen auch ein Surrogate-Paar erzeugen darf. Ich schätze, es sind auch 32-bittige \x-Escapesequenzen zugelassen. Zusätzlich gibt es auch UTF-8-Literale, deren Präfix u8 ist. Allerdings gibt es hier keinen extra Zeichentypen; denn es kommt auch ein normales char-Array heraus, welches eine UTF-8 kodierte Version der Zeichenkette enthält. Komischerweise gibt es kein &quot;UTF-8 Zeichenliteral&quot; (was dann äquivalent zu ASCII sein sollte). Ich schätze mal, dass auf einer sehr komischen Plattform 'A' und u8&quot;A&quot;[0] zwei unterschiedliche Werte haben kann, da 'A' ein Wert eines systemspezifisches &quot;excecution character set&quot; ist und u8&quot;A&quot;[0] den Wert 65 haben müsste, weil das das erste Byte der UTF-8-Kodierung des Strings ist. Aber wenn man die 65 haben möchte, kann man natürlich auch einfach 65 hinschreiben oder static_cast&lt;char&gt;(65). <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";-)"
      alt="😉"
    /></p>
<p>Ich habe mich nicht allzu intensiv mit Zeichensätzen und Literalen auseinandergesetzt. Vielleicht habe ich auch etwas falsch verstanden oder übersehen. Korrekturen sind willkommen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2065265</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2065265</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Wed, 18 May 2011 14:00:09 GMT</pubDate></item></channel></rss>