Forum: PC-Programmierung ASCII Zeichen in C ausgeben?


von Cler (Gast)


Lesenswert?

Hey,

ich will EIN einiziges Zeichen in C anhand der ASCII Tabelle ausgeben, 
um genau zu sein das Euro Zeichen aber wie geht das in C?
Ich kenne die ASCII Tabelle und ich will diese nicht als Code ausgeben, 
sondern das einzelne Zeichen mittels printf ausgeben .. wie geht das?

Achja: Man kann ja auch ASCII Zeichen über den Hexadezimalwert ausgeben 
aber wie geht das in C?

Ich wüsste, wie das in C# und PHP geht aber in C kenne ich micht so gut 
aus.

Danke schon einmal im voraus

von Klaus W. (mfgkw)


Lesenswert?

Cler schrieb:
> Ich kenne die ASCII Tabelle und ich will diese nicht als Code ausgeben,
> sondern das einzelne Zeichen mittels printf ausgeben .. wie geht das?

Ich kenne auch die ASCII-Tabelle, die hat aber gar kein €-Zeichen.
Welche kennst du?

von Dennis (Gast)


Lesenswert?

1. Frage: welchen ASCII-Code hat denn das EURO-Zeichen?

von Cler (Gast)


Lesenswert?

Hmm ..
habe mich wohl doch geirrt aber wieso kann das Zeichen dann nicht in der 
Console dargestellt werden?
Ist das einfach ein Darstullungsproblem?

Die Frage bleibt trotzdem noch:
Wie kann ich Zeichen aus der ASCII Tabelle mithilfe des Dezimal- oder 
des Hexadzimalwertes ausgeben?

von Klaus W. (mfgkw)


Lesenswert?

Ansonsten gibt es z.B. putchar().
ein Leerzeichen könnte man z.B. ausgeben als:
1
putchar(  );
2
putchar( ' ' );
3
putchar( 32 );
4
putchar( 0x20 );

von sebi707 (Gast)


Lesenswert?

Man kann auch mit der Escape Sequence \x innerhalb von Strings 
Hexadezimalwerte einfügen. Also etwa:
printf("Hier ist ein Euro-Zeichen: \xA4");

Wobei zumindest nach dieser Codierung 
(http://de.wikipedia.org/wiki/ISO_8859-15) das €-Zeichen auf 0xA4 liegt. 
Wie es dann dargestellt wird liegt am Betriebsystem und dem 
eingestellten Zeichensatz.

von Cler (Gast)


Lesenswert?

geht das auch irgendwie mit dem printf Befehl?

von Klaus W. (mfgkw)


Lesenswert?

ja, indem man eine oktale oder hexadezimale \...-Sequenz in den String 
einfügt.
Steht in 99.9% aller C-Bücher hoffentlich...

Ebenso wie in dem Post drüber :-)

: Bearbeitet durch User
von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Cler schrieb:
> geht das auch irgendwie mit dem printf Befehl?

Lesen:

sebi707 schrieb:
> printf("Hier ist ein Euro-Zeichen: \xA4");



Allerdings musst Du berücksichtigen, wo Du Dein Euro-Zeichen ausgeben 
willst. Du schriebst was von "Konsole" -- meinst Du damit das 
Windows-Kommandozeilenfenster?

Das verwendet normalerweise eine andere Zeichencodierung als 
beispielsweise Notepad, nämlich Codepage 850.

Windows-Programme (wie Notepad etc.) verwenden hingegen Codepage 1252.

Im Kommandozeilenfenster kann zwar die verwendete Codepage eingestellt* 
werden, aber sinnvolle Ergebnisse gibt es nur, wenn auch eine geeignete 
Schriftart verwendet wird. Die Pixel-Schrift, die standardmäßig 
verwendet wird, die kann nur für Codepage 850 verwendet werden.

Sinnvoll sind hier "Lucida Console" oder "Consolas".


*) Entweder per Win32-API SetConsoleOutputCP
http://msdn.microsoft.com/en-us/library/windows/desktop/ms686036%28v=vs.85%29.aspx

oder per Kommandozeilenbefehl
mode con cp select=1252

von Tom (Gast)


Lesenswert?

Rufus Τ. Firefly schrieb:
> das
> Windows-Kommandozeilenfenster?

Nichtantike Linuxe (BSD und OS X wahrscheinlich auch) sollten von Haus 
aus in Terminalfenster (und auch in reinem Textmodus) UTF8 sprechen und 
keine Problem mit der Darstellung von "Sonderzeichen" haben:
printf("\u20AC");

von Georg (Gast)


Angehängte Dateien:

Lesenswert?

Dennis schrieb:
> 1. Frage: welchen ASCII-Code hat denn das EURO-Zeichen?

Das lässt sich nicht so leicht beantworten, weil das Eurozeichen 
offiziell den Unicode hex 20AC hat. In vielen Fällen wird € jedoch auf 
das ASCII-Zeichen 128 gemappt, siehe beigefügte ASCII-Tabelle. Windows 
macht das auch, wenn der Font so alt ist, dass er garkein € enthält, 
wenn man chr(128) ausgibt, aber lustigerweise dann nicht, wenn € normal 
in einem text steht - vermutlich, weil, zumindest bei neueren Windowsen, 
im Text nicht ASCII 128, sonder Unicode 20AC steht.

Ich würde es erst mal mit 128 probieren, wie man Unicode in C ausgibt 
weiss ich nicht.

Georg

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Tom schrieb:
> (und auch in reinem Textmodus)

Das allerdings wäre ... verwunderlich, wenn "reiner Textmodus" wirklich 
"reiner Textmodus" heißt. Der nämlich nutzt einen 8-Bit-Zeichensatz mit 
CP437, der im BIOS der Graphikkarte abgelegt ist.

Zwar lässt der sich ändern, aber das ändert nichts an der "8-bit-ness", 
so daß halt nicht mehr als 256 unterschiedliche Glyphen dargestellt 
werden können.

von Rolf Magnus (Gast)


Lesenswert?

Georg schrieb:
> Dennis schrieb:
>> 1. Frage: welchen ASCII-Code hat denn das EURO-Zeichen?
>
> Das lässt sich nicht so leicht beantworten, weil das Eurozeichen
> offiziell den Unicode hex 20AC hat. In vielen Fällen wird € jedoch auf
> das ASCII-Zeichen 128 gemappt, siehe beigefügte ASCII-Tabelle.

Dies ist keine ASCII-Tabelle, und ein ASCII-Zeichen 128 gibt es auch 
nicht, da ASCII ein 7-Bit-Zeichensatz ist, somit geht es nur bis 127.

von Georg (Gast)


Lesenswert?

Rolf Magnus schrieb:
> Dies ist keine ASCII-Tabelle

Äusserst hilfreich.

Georg

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Georg schrieb:
> Äusserst hilfreich.

Aber korrekt. Es bringt nichts, wenn man irgendwelche 
Zeichencodierungen als "ASCII" bezeichnet, außer Verwirrung.

Als 8-Bit-Zeichentabelle ist ISO8859-1 wohl die häufigste Variante, 
insbesondere in der Microsoft-Interpretation als Codepage 1252 
("ANSI"-Zeichensatz genannt).

von Rolf Magnus (Gast)


Lesenswert?

Rufus Τ. Firefly schrieb:
> Als 8-Bit-Zeichentabelle ist ISO8859-1 wohl die häufigste Variante,

bzw. ISO-8859-15, das sich von ISO-8859-1 vor allem dadurch 
unterscheidet, daß es das Euro-Zeichen hat.

Georg schrieb:
> Rolf Magnus schrieb:
>> Dies ist keine ASCII-Tabelle
>
> Äusserst hilfreich.

Ich bin immer gerne bereit, jemandem bei der Erkenntnis zu helfen, daß 
er was falsches erzählt hat. ;-)

von Georg (Gast)


Lesenswert?

Rolf Magnus schrieb:
> Ich bin immer gerne bereit, jemandem bei der Erkenntnis zu helfen, daß
> er was falsches erzählt hat. ;-)

Zitat Microsoft:
"Der ISO-ANSI ASCII-Zeichensatz wird von Windows verwendet, jedoch es 
ist nicht identisch mit dem IBM PC-OEM ASCII-Zeichensatz, obwohl die 
unteren 128 Zeichen identisch sind. "

Dein Einwand ist reine Klugscheisserei ("Klug" ist eigentlich ja nicht 
korrekt). Ich bin jedenfalls nicht so grössenwahnsinnig alles besser 
wissen zu wollen als MS und IBM. Aber wenn du dich dann besser fühlst...

Meinetwegen kannst du dich ruhig für den GRÖPAZ halten.

Georg

von Klaus W. (mfgkw)


Lesenswert?

Georg schrieb:
> Meinetwegen kannst du dich ruhig für den GRÖPAZ halten.

Auch wenn es dir nicht passt: die Frage war nach ASCII und €-Zeichen.
Da wird man doch wohl nnoch darauf hinweisen dürfen, daß ASCII-Zeichen 
nur bis 127 gehen und € nicht enthält.


Mehr kann man dazu ehrlicherweise auch gar nicht sagen, solange der OP 
nicht verrät, womit er arbeitet. Windows? Welches? Mit welcher Codepage?

von Rolf Magnus (Gast)


Lesenswert?

Georg schrieb:
> Rolf Magnus schrieb:
>> Ich bin immer gerne bereit, jemandem bei der Erkenntnis zu helfen, daß
>> er was falsches erzählt hat. ;-)
>
> Zitat Microsoft:
> "Der ISO-ANSI ASCII-Zeichensatz wird von Windows verwendet, jedoch es
> ist nicht identisch mit dem IBM PC-OEM ASCII-Zeichensatz, obwohl die
> unteren 128 Zeichen identisch sind. "

ASCII ist eine Norm. Im Zweifelsfall zählt, was die sagt und nicht was 
irgendwer bei Mirosoft darüber denkt. Hier die orginal-Spezifikation: 
http://worldpowersystems.com/archives/codes/X3.4-1963/index.html

Die meisten 8-Bit-Zeichensätze basieren auf ASCII, d.h. die untere 
Hälfte ist gleich wie bei ASCII. Das bedeutet aber nicht, daß die 
automatisch auch alle ASCII heißen. Siehe auch 
https://en.wikipedia.org/wiki/Extended_ASCII

> Dein Einwand ist reine Klugscheisserei ("Klug" ist eigentlich ja nicht
> korrekt). Ich bin jedenfalls nicht so grössenwahnsinnig alles besser
> wissen zu wollen als MS und IBM. Aber wenn du dich dann besser fühlst...
>
> Meinetwegen kannst du dich ruhig für den GRÖPAZ halten.

Warum kannst du nicht einfach akzeptieren, daß du was falsches 
geschrieben hast, statt persönlich zu werden, weil du keine Argumente 
hast?

von Yalu X. (yalu) (Moderator)


Lesenswert?

Rolf Magnus schrieb:
> ASCII ist eine Norm. Im Zweifelsfall zählt, was die sagt und nicht was
> irgendwer bei Mirosoft darüber denkt. Hier die orginal-Spezifikation:
> http://worldpowersystems.com/archives/codes/X3.4-1963/index.html

Auch von mir ein kleiner Beitrag zur hier zuhauf stattfindenen
Defäkation von Intelligenz:

Es zählt bei einer Norm immer nur die neueste Ausgabe. ASA X3.4-1963
hingegen ist die älteste und wurde nacheinander abgelöst durch ASA
X3.4-1965, USASI X3.4-1967, USASI X3.4-1968, ANSI X3.4-1977 und ANSI
X3.4-1986.

Die derzeit gültige Norm ist also ANSI X3.4-1986. Der Code nach dieser
Norm enthält im Vergleich zur ursprünglichen Definition eine ganze Menge
zusätzlicher Zeichen, aber immer noch kein Euro-Zeichen. Der TE wird
also andere Code-Tabellen zu Rate ziehen müssen, am besten diejenige,
die von dem von ihm genutzten (realen oder virtuellen) Ausgabegerät
unterstützt wird :)

Georg schrieb:
> Zitat Microsoft:
> "Der ISO-ANSI ASCII-Zeichensatz wird von Windows verwendet, jedoch es
> ist nicht identisch mit dem IBM PC-OEM ASCII-Zeichensatz, obwohl die
> unteren 128 Zeichen identisch sind. "

Mal abgesehen von der üblen Grammatik, die MS hier an den Tag legt:

Die Codepage 1252, um die es hier wohl geht, ist weder von der ISO noch
vom ANSI genormt und (wie bereits mehrfach geschrieben) auch nicht mit
dem ASCII gleichzusetzen.

: Bearbeitet durch Moderator
von Georg (Gast)


Lesenswert?

Rolf Magnus schrieb:
> Warum kannst du nicht einfach akzeptieren, daß du was falsches
> geschrieben hast, statt persönlich zu werden

Es geht überhaupt nicht um Persönliches, du kannst mich ruhig für so 
blöd halten wie du es brauchst, ich finde es nur unfair gegenüber dem 
TO: der wollte wissen wie er ein Eurozeichen ausgibt und keine 
Lehrstunde über die Geschichte der IT. Dazu hat dein Beitrag nicht nur 
nichts beigesteuert, sondern führt nur zu zusätzlicher Verwirrung. Und 
das bloss zur Selbst-Bebauchpinselung, wie furchtbar überlegen du doch 
dem TO an Fachwissen bist (und mir gegenüber natürlich auch, das 
bestreitet ja niemand).

Vielleicht machst du dir ja mal klar, dass die von dir angeführte Norm 
aus der Mitte des vorigen Jahrhunderts wohl kaum was zum Eurozeichen zu 
sagen haben kann.

Georg

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Georg schrieb:
> der wollte wissen wie er ein Eurozeichen ausgibt und keine Lehrstunde
> über die Geschichte der IT.

Ohne etwas über die Hintergründe zu erfahren, wäre er mit der 
Information nur eines Zeichencodes aber keinen Schritt weitergekommen, 
weil je nachdem womit und wohin das Zeichen "ausgegeben" wird, das 
völlig unterschiedliche Ergebnisse liefern kann. Die wichtige(!) 
Erkenntnis ist, daß je nach Ziel der Ausgabe völlig unterschiedliche 
Zeichencodierungssysteme verwendet werden - und daß man, um diese 
auseinanderhalten zu können, nicht plump von "ASCII" reden sollte.

von Rolf Magnus (Gast)


Lesenswert?

Georg schrieb:
> Rolf Magnus schrieb:
>> Warum kannst du nicht einfach akzeptieren, daß du was falsches
>> geschrieben hast, statt persönlich zu werden
>
> Es geht überhaupt nicht um Persönliches, du kannst mich ruhig für so
> blöd halten wie du es brauchst,

Ich halte dich nicht für blöd, sondern hab lediglich eine Falschaussage 
korrigiert, mehr nicht. Ich hab keine Ahnung, warum du da so einen 
Aufstand machst. Du nimmst das offenbar sehr persönlich.

> ich finde es nur unfair gegenüber dem TO: der wollte wissen wie er ein
> Eurozeichen ausgibt und keine Lehrstunde über die Geschichte der IT.

Er wollte wissen, wie er das Eurozeichen "anhand der ASCII-Tabelle" 
ausgeben kann. Die ASCII-Tabelle enthält aber kein Euro-Zeichen. Genau 
das habe ich geschrieben. Nun gibt es je nach Zeichensatz durchaus 
unterschiedliche Positionen, an denen das Euro-Zeichen sein kann, also 
müßte man wissen, welchen Zeichensatz er tatsächlich hat. Das hast du ja 
auch schon geschrieben, nur hast du das halt auch ASCII genannt, und DAS 
ist es, was dann zur Verwirrung beiträgt.

> Und das bloss zur Selbst-Bebauchpinselung, wie furchtbar überlegen du
> doch dem TO an Fachwissen bist (und mir gegenüber natürlich auch, das
> bestreitet ja niemand).

Und das nennst du nicht persönlich. Fakt ist, daß du hier sehr wohl 
persönlich und beleidigend wirst.
Daß du mir ständig irgendwelchen Unsinn unterstellst, ist auch in 
keinster Weise hilfreich. Wenn du an einer sachlichen Diskussion kein 
Interesse hast, sondern nur stänkern willst, bringt das nichts, also ist 
für mich die Diskussion hiermit beendet.

> Vielleicht machst du dir ja mal klar, dass die von dir angeführte Norm
> aus der Mitte des vorigen Jahrhunderts wohl kaum was zum Eurozeichen zu
> sagen haben kann.

Was mitunter auch zeigt, daß ASCII eben gar kein Euro-Zeichen enthalten 
kann.

von Cler (Gast)


Lesenswert?

Da ich eigentlich davon ausgegangen bin, dass das Euro Zeichen in der 
ASCII Tabelle ist, habe ich das auch so in der Überschrift geschrieben.

Ich beschäftgie mich, wie oben auch geschrieben noch nicht sehr lange 
mit C. Derzeit benuttze ich die IDE von Orwell (Dev C++) und ich will 
das Euro Zeichen auf die cmd von Windows kriegen.
Ich benutze Windows 7 aber wie man zu dieser Codepage kommt oder was das 
überhaupt ist, weiß ich nicht.

Wie kann ich denn dann das € Zeichen auf die Konsole bringen oder geht 
das nicht?

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Cler schrieb:
> Wie kann ich denn dann das € Zeichen auf die Konsole bringen oder geht
> das nicht?

Doch. Sieh halt nach, welchen Code das Zeichen in der von der Konsole 
normalerweise verwendeten Codepage hat und gib den via printf oder was 
auch immer Dir gefällt aus.

Wie ich bereits schrieb, ist die Codepage der "Eingabeaufforderung" (und 
beliebiger anderer Konsolfenster) normalerweise 850.

Wenn Dein Konsolfenster nicht die standardmäßige Pixelbrocken-Schrift 
verwendet, sondern von Dir auf "Lucida Console" oder "Consolas" 
umgestellt ist, dann kannst Du mit der Win32-API-Funktion 
SetConsoleOutputCP die Codepage umstellen, sinnvollerweise auf 1252, 
denn das entspricht der Zeichencodierung, die die meisten Editoren unter 
Windows verwenden. Vorsicht auch hier, manche verwenden mittlerweile 
Unicode in Form von UTF-8, und das versteht das Konsolenfenster wiederum 
nicht.

Wie auch immer, ob Du nun Codepages umstellst oder nicht, ein Zeichen 
anhand seines Zeichencodes kann man mit

  printf("Mein tolles Zeichen \xAB in der Konsole\n");

ausgeben, der Zeichencode wird hier hexadezimal angegeben (hier im 
Beispiel 0xAB, was das Euro-Zeichen in der von Dir schlussendlich 
genutzten Codepage ist, musst Du selber rausfinden. Das schaffst Du.).

Auch die in C++ üblichen Streaming-Operatoren lassen sich so verwenden.

  cout << "Mein tolles Zeichen \xAB in der Konsole\n";

von Cler (Gast)


Lesenswert?

Ich habe ja schon im Internet geguckt und unter Windows scheint es wohl 
0x80 zu sein aber das funktioniert nicht.
Es wird wohl so ein C mit nem Strich nach unten links gezeigt aber ich 
will ja das wirkliche Euro Zeichen haben.

Ich habe auch hier mal nachgeschaut aber ich sehe da kein Euro Zeichen.
http://de.wikipedia.org/wiki/Codepage_850

Ich hätte ja nicht gedacht, dass das ganze so kompliziert ist ...

von Cler (Gast)


Lesenswert?

Ich habe auch nicht die Codepage umgestellt, jedenfalls nicht das 
wüsste. Ich habe Windows auch vor kurzem erst neuinstalliert, von daher 
müsste der Standard ja wohl noch aktiviert sein.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Cler schrieb:
> Es wird wohl so ein C mit nem Strich nach unten links gezeigt

Das ist das Zeichen, das erscheint, wenn 0x80 ausgegeben und CP850 
verwendet wird (was, wie ich bereits mehrfach schrieb, in der Konsole 
unter Windows standardmäßig der Fall ist).

Ein Ç.

Um ein Euro-Zeichen ausgeben zu können, musst Du die Codepage 
umschalten. Das geht --wie ich bereits mehrfach geschrieben habe-- mit 
der Win32-API-Funktion SetConsoleOutputCP, setzt aber voraus, daß die in 
der Konsole verwendete Schriftart das Zeichen auch darstellen kann.

Die Pixelschrift kann das nicht, Du musst also in den Eigenschaften des 
Konsolenfensters entweder "Lucida Console" oder "Consolas" einstellen.

Nein, dafür gibt es keine API-Funktion, das musst Du von Hand machen.

von Jens G. (jensig)


Lesenswert?

Wenn es um die Kommandozeile geht, dann einfach Lucidia Console 
einstellen in den Eigenschaften der Kommandozeile (oder irgendeine 
andere, die den Euro kennt), und zusätzlich "chcp 1252" ausführen, damit 
der Euro erscheint (bzw. die 0x80 als Euro erkannt wird).

von Freddy F. Frettchen (Gast)


Lesenswert?


von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Cler schrieb:
> Ich habe auch nicht die Codepage umgestellt, jedenfalls nicht das
> wüsste.

Gerade das musst Du aber tun! Die Console - sprich Eingabeaufforderung 
- kann in der Standard-Einstellung überhaupt kein Euro-Zeichen ausgeben.

> Ich habe Windows auch vor kurzem erst neuinstalliert, von daher
> müsste der Standard ja wohl noch aktiviert sein.

Ja, eben, der "Standard" für die Console ist ja genau die Krücke.

Jetzt verstanden?

Also ignoriere nicht die Hinweise, die Dir gegeben wurden, sondern wende 
sie an.

von Klaus W. (mfgkw)


Lesenswert?

Um es gegebenenfalls permanent zu machen, in 
...\Windows\System32\AUTOEXEC.NT eintragen:
1
chcp ...

Hat zumindest unter Windows 2000 noch funktioniert.

PS: das betrifft nur cmd.exe, nicht das restliche System.

: Bearbeitet durch User
von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Sinnvoller dürfte es sein, das im Programm zu machen.

Wie das geht, habe ich schon so oft geschrieben, daß ich das jetzt nicht 
nochmal wiederhole.

Bei neueren Windows-Versionen (ab "Vista") lässt sich sogar die 
verwendete Schriftart mit der API-Funktion SetCurrentConsoleFontEx 
einstellen.

http://msdn.microsoft.com/en-us/library/ms686200%28v=VS.85%29.aspx

enthält sogar ein Beispiel.

In dem ist allerdings der Aufruf von wcscpy_s fehlerhaft, hier sollte 
statt
1
wcscpy_s(cfi.FaceName, L"Consolas");

noch die Länge des Zielpuffers angegeben werden:
1
wcscpy_s(cfi.FaceName, LF_FACESIZE, L"Consolas");

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.