{"id":3320,"date":"2018-01-11T09:00:45","date_gmt":"2018-01-11T08:00:45","guid":{"rendered":"http:\/\/roboblog.fatal-fury.de\/?p=3320"},"modified":"2018-08-10T07:58:52","modified_gmt":"2018-08-10T06:58:52","slug":"c-guns-c-unicode","status":"publish","type":"post","link":"http:\/\/roboblog.fatal-fury.de\/?p=3320","title":{"rendered":"C++ Guns: C++ &#038;& Unicode"},"content":{"rendered":"<p>Vorheriger Post <a href=\"http:\/\/roboblog.fatal-fury.de\/?p=1654\">Qt && Unicode<\/a><\/p>\n<p>Heute m\u00f6chste ich Unicode Zeichen mit C++ schreiben. Und zwar mit dem normalen 1 Byte std::string und std::ostream, also std::cout. Mit Qt war das einfach, wie im vorherigen Post zu lesen ist. Die Klasse QString nutz intern 2 Byte Zeichen und sonst k\u00fcmmert sich Qt ja auch um alles.<\/p>\n<p>Mit std C++ ist es eigentlich auch ganz einfach. Man darf sich nur nicht durch UTF8, UTF16, UTF32, Raw Strings, Kodierungen und Locale verwirren lassen.<\/p>\n<p>Das Problem ist einfach gesagt, dass es viel mehr Zeichen auf der Welt gibt, als mit einem normalen, klassichen 1 Byte char dargestellt werden kann. Da passen nur 256 unterscheidliche Zeichen rein. Von denen werden f\u00fcr ASCII noch viel weniger benutzt. Um mehr Zeichen darzustellen, nutzt man einfach einen gr\u00f6\u00dferen Char Type. Da gibt es den wide char wchar_t, der aber nicht standardisiert ist und unter Windows und Linux wohl unterschiedlich viele Byte gelegt.<\/p>\n<p>Die standardisierten Typen lauten char16_t und char32_t mit 2 und 4 Byte. Mit dem 4 Byte Char lassen sich ca. 2 bzw 4 Milliarden unterschiedliche Zeichen darstellen! Das sollte dann wohl reichen.<br \/>\nLeider bezahlt man daf\u00fcr mit doppelten bzw. vierfachen Speicherplatzverbrauch, was f\u00fcr manche Anwendungen unm\u00f6glich ist. Noch dazu m\u00f6chte man auch kompatibel zu anderen Code sein, der komplett auf std::string setzt. Und das st\u00e4ndige Unterscheiden zwischen std::string, std::wstring, std::u16string und std::u32string ist auch unm\u00f6glich.<\/p>\n<p>Also hat man sich \u00fcberlegt, ob nicht die gebr\u00e4uchlichsten UTF-32 Zeichen als 1- oder 2 Byte gespeichert werden kann. So ist dann wohl UTF-16 und UTF-8 entstanden.<br \/>\nKonkret bedeutet dies, dass UTF-8 eine Kodierung mit variabler Breite ist. H\u00e4ufig vorkommende Zeichen passen in 1 Byte, weniger oft verwendete Zeichen in 2 Byte und seltene Zeichen in 3 oder 4 Byte.<\/p>\n<p>Damit ist, bist auf Umlaute, wieder alles gut. Umlaute m\u00fcssen in UTF-8 als zwei 1 Byte Zeichen kodiert werden. Damit besteht der UTF-8 String u8\"L\\u00e4cheln!\" zwar aus ach Unicode-Zeichen, aber da das zweite Zeichen ein kleines \u00e4 ist, welches in UTF-8 als zwei Bytes, n\u00e4mlich 0xc3a4 kodiert ist, ist der komplette String 9 Zeichen lang!<\/p>\n<p>Dies f\u00fchrt nun zu bestimmten Problemen, wenn Strings nach ihrer L\u00e4nge ausgewertet werden. Oder wenn Zeichen in UTF-8 Strings gesucht werden. Aus diesem Grund benutzt Qt's QString Klasse wohl UTF-16.<\/p>\n<p>Beispiele:<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\n    std::string UTF8laecheln1 = &quot;L\u00e4cheln!&quot;;\r\n    std::string UTF8laecheln2 = u8&quot;L\\u00e4cheln!&quot;;\r\n    std::cout &lt;&lt; &quot;locale    : &quot; &lt;&lt; UTF8laecheln1 &lt;&lt; &quot; size: &quot; &lt;&lt; UTF8laecheln1.size() &lt;&lt; &quot;\\n&quot;;\r\n    std::cout &lt;&lt; &quot;UTF-8     : &quot; &lt;&lt; UTF8laecheln2 &lt;&lt; &quot; size: &quot; &lt;&lt; UTF8laecheln2.size() &lt;&lt; &quot;\\n&quot;;\r\n    std::cout &lt;&lt; u8&quot;\\u2581&quot; &lt;&lt; u8&quot;\\u2582&quot; &lt;&lt; u8&quot;\\u2583&quot; &lt;&lt; u8&quot;\\u2584&quot; &lt;&lt; u8&quot;\\u2585&quot; &lt;&lt; u8&quot;\\u2586&quot; &lt;&lt; u8&quot;\\u2587&quot; &lt;&lt; u8&quot;\\u2588&quot;;\r\n<\/pre>\n<pre>locale    : L\u00e4cheln! size: 9\r\nUTF-8     : L\u00e4cheln! size: 9\r\n????????\r\n<\/pre>\n<p>Scheint als w\u00e4re mein Code Editor schon auf UTF8 eingestellt, der Browser wohl nicht. Die Konvertierung nach UTF-16 ist leider schon wieder so ein Brainfuck, dass ich obwohl mit Beispiel nicht geschafft habe.<\/p>\n<p>Im Unicodeblock 00 findet ihr die Umlaute.<br \/>\n\u00e4 00E4<br \/>\n\u00c4 00C4<br \/>\n\u00f6 00F6<br \/>\n\u00d6 00D6<br \/>\n\u00fc 00FC<br \/>\n\u00dc 00DC<br \/>\n<a href=\"https:\/\/de.wikipedia.org\/wiki\/Unicodeblock_Lateinisch-1,_Erg%C3%A4nzung\">Unicodeblock_Lateinisch-1, Erg\u00e4nzung<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Vorheriger Post Qt &#038;& Unicode Heute m\u00f6chste ich Unicode Zeichen mit C++ schreiben. Und zwar mit dem normalen 1 Byte std::string und std::ostream, also std::cout. Mit Qt war das einfach, wie im vorherigen Post zu lesen ist. Die Klasse QString nutz intern 2 Byte Zeichen und sonst k\u00fcmmert sich Qt ja auch um alles. Mit [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4],"tags":[17],"class_list":["post-3320","post","type-post","status-publish","format-standard","hentry","category-allgemein","tag-cpp"],"_links":{"self":[{"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=\/wp\/v2\/posts\/3320","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=3320"}],"version-history":[{"count":7,"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=\/wp\/v2\/posts\/3320\/revisions"}],"predecessor-version":[{"id":3654,"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=\/wp\/v2\/posts\/3320\/revisions\/3654"}],"wp:attachment":[{"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=3320"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=3320"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=3320"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}