ubuntuusers.de

UTF-8 Ausgabe bei C Programm

Status: Ungelöst | Ubuntu-Version: Kubuntu 8.10 (Intrepid Ibex)
Antworten |

blaue_elise

Anmeldungsdatum:
19. Februar 2009

Beiträge: 6

Hallo!

Habe mir vor ein paar Jahren ein kleines Programm geschrieben (C-Code druckbare Zeichen) um mir die druckbaren Zeichen auszugeben, lief und läuft auch problemlos solange ich meine Konsole auf ISO 8859-x einstelle. Wenn ich allerdings auf UTF-8 umstelle ist wenig überraschend, ab dem Zeichen mit der Nummer 160 nur noch das Fragezeichen in der Raute (�) zu sehen. Kann mir vielleicht jemand von euch helfen dieses Problem lösen? Konkret, wie muss ich mein Programm ändern damit es unter UTF-8 die Zeichen richtig darstellt? Bin nämlich trotz stundenlanger Suche im WWW und auch der Suche hier im Forum nicht in der Lage mein Programm richtig zum Laufen zu bekommen.

Lieber Gruß und vielen Dank

Blaue Elise

stfischr Team-Icon

Avatar von stfischr

Anmeldungsdatum:
1. März 2007

Beiträge: 19197

Selbst in C++ ist es (ohne entsprechende Bibliotheken) ein Qual mit UTF-8 unter C geht es langsam richtung Folter. Es gibt so viel, woran man nicht denkt ...

Hier ist ne kleine Anleitung. http://www.cl.cam.ac.uk/~mgk25/unicode.html#c

blaue_elise

(Themenstarter)

Anmeldungsdatum:
19. Februar 2009

Beiträge: 6

Hallo stfischr!

Vielen Dank für deine schnelle Antwort. War bei meiner Suche im WWW auch auf diese Seite gestoßen, habe sie aber nicht weiter in betracht gezogen, da dort printf statt wprintf für die Ausgabe vorgeschlagen wird, was auf vielen anderen Seiten die sich mit diesem Thema befassen als schlechter Stil bezeichnet wird. Habe jetzt aber den Code (C-Code druckbare Zeichen) wie folgt geändert:

Nach Zeile 1 wurde folgendes eingefügt:

1
2
#include <locale.h>
#include <wchar.h>

Vor Zeile 8 wurde folgendes eingefügt:

1
setlocale(LC_CTYPE, "");

Die Zeilen 22 und 23 wurden durch die Folgenden ersetzt:

1
2
printf ("%3d (%08d): %lc", i, dectobin (i, 8), (wint_t)i);
putwchar ((wint_t)i);

Wie aus diesen beiden Codezeilen ersichtlich ist, gebe ich nun das gewünschte Zeichen doppelt aus. Das Ergebnis war leider etwas ernüchternd, denn die Ausgabe mit printf funktioniert zwar so wie ich mir das vorgestellt hätte aber putwchar liefert wieder nur �. Weiters habe ich es auch nicht geschafft die Ausgabe mit wprintf zu machen.

Falls Du oder sonst jemand einen noch einen Tipp hätte wie ich das zu schaffen wäre, würde ich mich über weitere Hilfe sehr freuen. (Scheint so als wäre ich recht Qual- und Folterresistent. ☺)

Lieber Gruß und vielen Dank

Blaue Elise

Marc_BlackJack_Rintsch Team-Icon

Ehemalige
Avatar von Marc_BlackJack_Rintsch

Anmeldungsdatum:
16. Juni 2006

Beiträge: 4695

Wohnort: Berlin

@blaue elise: IMHO machst Du es Dir etwas zu einfach die Werte 32 bis 126 und 160 bis 255 zu verwenden. Damit gehst Du von einer internen Kodierung für wchar_t aus, die so nicht garantiert ist, bzw. höchstens für den gcc. Wenn Du die ISO-8859-1 Zeichen mit diesen Werten auf einer UTF-8 Konsole ausgeben willst, wäre es sauberer auch wirklich von ISO-8859-1 nach UTF-8 zu konvertieren. Siehe den Header inconv.h.

blaue_elise

(Themenstarter)

Anmeldungsdatum:
19. Februar 2009

Beiträge: 6

Hallo Marc!

Auch Dir vielen Dank für die Antwort, habe mit ihr allerdings so meine Probleme, da ich von den ganzen Kodierungssachen keine Ahnung habe. 🙄 Dachte mir, dass es möglich sein sollte mein Problem halbwegs Plattform übergreifend mit wchar.h bzw. wctype.h zu lösen, da es sich ja dabei um Headerdateien handelt die zum Standard gehören (Normative Amandment 1 (1995)) und daher überall verfügbar sein sollten. Daher bin ich wie bereits in meinem vorherigen Beitrag erwähnt mit der obigen "Lösung" auch nicht wirklich zufrieden, da ich ja auch nicht in der Lage bin wprintf oder putwchar zu verwenden. Daher habe ich auch diese Diskussion noch nicht auf "gelöst" gesetzt, da ich auf weitere Vorschläge, wie etwa den deinigen 👍, warten wollte. Gehört inconv.h auch zum Standard, konnte nämlich diesbezüglich nichts finden. Deinen Einwand bezüglich des Wertebereichs (32-126, 160-255) verstehe ich leider nicht, es sollte doch keine Rolle spielen welche Untermenge von 0-32767 (wint_t) ich ausgebe. 😕 Aber wie oben schon erwähnt, habe ich eben diesbezüglich keine Ahnung und wollte eigentlich ja auch nicht von ISO-8859-1 bzw. 15 nach UTF-8 konvertieren sondern einfach meine C-Programme dazu motivieren ihre Ausgabe in UTF-8 zu machen. Daher habe ich auch obigen Versuchsballon gestartet. Wie es aber scheint bin ich zu naiv dafür, habe mir die Sache zu einfach vorgestellt und muss diesbezüglich noch einiges lernen. Daher würde ich mich sehr über weitere sachdienliche Hinweise, insbesondere Code-Beispiele freuen.

Liebe Grüße und vielen Dank

Blaue Elise

Marc_BlackJack_Rintsch Team-Icon

Ehemalige
Avatar von Marc_BlackJack_Rintsch

Anmeldungsdatum:
16. Juni 2006

Beiträge: 4695

Wohnort: Berlin

wchar_t und wint_t sind zwar Standard, der sagt aber nichts darüber, was die Zahlenwerte bedeuten, also welche Zahl welches Zeichen repräsentiert, oder ob sie überhaupt für ein druckbares oder gar gültiges Zeichen steht. Genau wie das bei char ja auch nicht vom C-Standard festgelegt ist. Deswegen der Einwand mit den Wertebereichen.

iconv.h gehört nicht zum C-Standard. Wäre aber auch komisch, wo der ja noch nicht einmal Aussagen über die Bedeutungen von wchar_t- und char-Werten trifft. Zeichensätze sind einfach ausserhalb des C-Standards. Was auch Sinn macht, wenn man überlegt wie gross die Systemvielfalt ist, für die es C-Compiler gibt. Allerdings ist iconv.h POSIX-Standard.

Antworten |