ubuntuusers.de

[C] Umlaut als Char

Status: Ungelöst | Ubuntu-Version: Ubuntu 10.10 (Maverick Meerkat)
Antworten |

STaRDoGGCHaMP

Anmeldungsdatum:
17. April 2011

Beiträge: Zähle...

Hallo,

Da ich erst vor kurzer zeit auf Ubuntu umgestiegen bin, spiele ich immer noch mit dem System herum. Unter anderem habe ich gerade ein kleines C-Programm unter geschrieben:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
#include <stdio.h>
#include <string.h>

int main()
{
        char* szTest = "Hallo schöne Welt";
        int i = 0;

        for(i = 0; i < strlen(szTest); i++)
                printf("szTest[%i]: %c (0x%.2X)\n", i, szTest[i], szTest[i]);

        return 0;
}

und mit

gcc -o test test.c

kompiliert. Aber es kommt anscheinend aufgrund des Umlauts "ö" zu folgender merkwürdigen Ausgabe:

szTest[0]: H (0x48)
szTest[1]: a (0x61)
szTest[2]: l (0x6C)
szTest[3]: l (0x6C)
szTest[4]: o (0x6F)
szTest[5]:   (0x20)
szTest[6]: s (0x73)
szTest[7]: c (0x63)
szTest[8]: h (0x68)
szTest[9]: � (0xFFFFFFC3)
szTest[10]: � (0xFFFFFFB6)
szTest[11]: n (0x6E)
szTest[12]: e (0x65)
szTest[13]:   (0x20)
szTest[14]: W (0x57)
szTest[15]: e (0x65)
szTest[16]: l (0x6C)
szTest[17]: t (0x74)

Im speziellen verwirren mich die beiden Zeilen:

szTest[9]: � (0xFFFFFFC3)
szTest[10]: � (0xFFFFFFB6)

Ich kenne mich mit Charsets und co. nicht so blendend aus. Aber es scheint als wird der Umlaut "ö" (oder Umlaute generell) mit mehr als einem Byte dargestellt, weswegen das hier ziemlich schief geht und strlen beispielsweise 18 zurück gibt, anstatt 17. Wie kann ich das vermeiden und eine "normale" Ausgabe hinkriegen?

Viele Grüße,

STaRDoGGCHaMP

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Wohnort: Wolfen (S-A)

Hi STaRDoGGCHaMP,

Du versuchst hier, einen utf-8 - codierten String byteweise auszugeben ...

Wie soll das denn gehen ??

Schau ihn Dir doch mal bei Licht an:

track@lucid:~$ echo "schöne"  |  hd
00000000  73 63 68 c3 b6 6e 65 0a                           |sch..ne.|

Du siehst deutlich, dass das "ö" mit 2 Bytes, "c3 b6" dargestellt wird. (→ http://de.wikipedia.org/wiki/UTF-8 )

Und genau das siehst Du bei Deiner Ausgabe auch. Die c3 und b6 sind einzeln keine gültigen Zeichen, deswegen werden sie mit dem Ersatzzeichen "�" dargestellt.
Was der Hex-Konverter dann genau macht, weiß ich nicht. Aber er zeigt zumindest die beiden Bytecodes mit an.

Wie gesagt: einen Multibyte-Code byteweise zu drucken ist nicht so gut ...

Für sowas sollte man utf-8 - bezogene Funktionen verwenden. (wie die bei C heißen, weiß ich allerdings nicht)

track

Lysander

Avatar von Lysander

Anmeldungsdatum:
30. Juli 2008

Beiträge: 2669

Wohnort: Hamburg

Es gibt für den Typen wchar. Ich würde allerdings mal in der Glib gucken, ob die nicht eine Unicode-Infrastruktur bereitstellt. Denn mit codierten Bytes zu arbeiten ist immer fehlerträchtig.

Antworten |