02.11 ASCII, Unicode und Character
Um ein Zeichen darzustellen werden verschiedene Codierungen verwendet. Zu den populärsten zählen wohl Unicode und ASCII. Was es mit diesen Codierungen auf sich hat und was diese mit chars
zu tun haben, erfahren Sie in diesem Kapitel.
ASCII
Der „American Standard Code for Information Interchange“ ist eine 7-Bit-Zeichenkodierung. Dabei entsprechen die Zahlen 0-127 einem bestimmten Zeichen. Die 65 steht z. B. für ein großes ‚A‘. Später wurde der ASCII-Code erweitert, so dass die Zahlen 0-255 für Zeichen verwendet werden können. Ein Zeichen im ASCII-Code ist also immer ein Byte groß. Welches Zeichen durch welche Zahl repräsentiert wird, kann aus so genannten ASCII-Tabellen entnommen werden.
Unicode
Im Unicode werden international alle Zeichen bzw. Textelemente in Form einer bestimmten Zahlenfolge gespeichert. In Java können diese Zeichen über den zugeordneten, hexadezimalen Key angesprochen werden. Dabei steht z. B. ein \u0061
für ein kleines ‚a‘. In dezimaler Schreibweise wäre das die 97 oder zur Darstellung in HTML ein a
. Weiterführende Informationen zum Unicode finden Sie hier.
ASCII und chars
Sie müssen einem char
nicht direkt ein Zeichen zuordnen, sondern können auch einen ASCII-Code als char
verwenden, sofern dieser im Bereich von 0-127 liegt.
char a = 65; System.out.println(a); // A
Es besteht natürlich auch die Möglichkeit, einen Integer
als char
auszugeben. Hierzu müssen Sie Ihren Integer
einfach in ein char
wandeln.
int i = 65; System.out.println((char)i);
Mit diesem Hintergrundwissen ist es selbstverständlich ein leichtes anhand der ASCII-Tabelle z. B. das Alphabet auszugeben (65-90):
for (int i = 65; i < 91; i++) { System.out.print((char)i + " "); }
Unicode in Java
Ähnlich wie bei ASCII-Code, kann auch anstelle einer direkten Eingabe des gewünschten Zeichens der entsprechende Unicode im char
angegeben werden. Dazu ist oben genannte, hexadezimale Form notwendig:
char ch = '\u0061'; System.out.println(ch); System.out.println("\u0061");
Aber Unicode kann nicht nur als Zeichen verwendet werden, sondern auch beliebig im Java Code. Bei diesem Beispiel wurden alle ‚a’s durch den entsprechenden Unicode ersetzt, und die Variable einmal mit ihrem „normalen“ Zeichen und einmal durch den Unicode angesprochen.
public cl\u0061ss Test { public st\u0061tic void m\u0061in(String[] \u0061rgs) { ch\u0061r \u0061 = '\u0061'; System.out.println(a); System.out.println(\u0061); } }
Oder ganz extrem (alles in eine Zeile schreiben, unter Test.java und ohne Package abspeichern, kompilieren und ausführen):
\u0070\u0075\u0062\u006C\u0069\u0063\u0020\u0063\u006C\u0061\u0073\u0073\u0020\u0054\u0065\u0073\u0074\u0020\u007B\u000A\u0070\u0075\u0062\u006C\u0069\u0063\u0020\u0073\u0074\u0061\u0074\u0069\u0063\u0020\u0076\u006F\u0069\u0064\u0020\u006D\u0061\u0069\u006E\u0028\u0053\u0074\u0072\u0069\u006E\u0067\u005B\u005D\u0020\u0061\u0072\u0067\u0073\u0029\u0020\u007B\u000A\u0053\u0079\u0073\u0074\u0065\u006D\u002E\u006F\u0075\u0074\u002E\u0070\u0072\u0069\u006E\u0074\u006C\u006E\u0028\u0022\u0048\u0061\u006C\u006C\u006F\u0020\u0057\u0065\u006C\u0074\u0022\u0029\u003B\u000A\u007D\u000A\u007D
Bei dem letzten Beispiel sollte man vielleicht dazu schreiben dass die Datei Test.java heißen muss!.
Da es sonst nicht funktioniert und es einen Fehler ausgibt.
Liegt es vielleicht daran dass das das selbe Beispiel ist wie HelloWorld nur in Unicode und das hier die public class Test heißt und deswegen die Datei auch Test.java heißen muss?
Hi Niko,
beim letzten Beispiel (das, das nur aus Unicode-Zeichen besteht und nicht als Code, sondern „Kommentar“ gekennzeichnet ist) steht doch dabei, dass man es unter Test.java abspeichern muss!? Falls du aber das vorletzte Beispiel meinst, kann ich noch einmal auf das Kapitel 01.04.02 Analyse des Quellcodes verweisen. Dort wurde angemerkt, dass Klassennamen und Dateinamen immer identisch sein sollten bzw. in den meisten Fällen auch müssen. Da dies eine Grundlage in der Java-Programmierung ist, haben wir in den weiteren Kapitel darauf verzichtet, dies jedes Mal explizit anzumerken.
Also noch mal kurz zusammengefasst: Der Klassennamen (in diesem Fall
Test
) sollte immer identisch mit dem Dateinamen (z. B. Test.java) sein. Falls die Klasse öffentlich (public
) ist, muss der Name sogar identisch sein.Gruß
Stefan
Wie du selbst erwähnst ist das eine Grundlage in der Java-Programmierung und sollte, meiner Meinung nach, besser hervorgehoben werden.
Ich habe das überlesen und erst hier gemerkt.
Außerdem würde es diesem Blog-Buch nicht schaden auch andere wichtige Grundlagen hervorzuheben.
Dinge die man in der Java-Programmierung immer wieder braucht oder verwendet wie z.B. dass mit der Klasse und dem Dateinamen.
Ich als Anfänger würde das sehr begrüßen;)
gruß
Hm, was hältst du von einem Kapitel „Häufige Anfängerfehler“ in 00.07 Tipps zur Programmierung? Würde dann halt noch ein wenig dauern, weil man das erst einmal alles zusammenschreiben und dann veröffentlichen müsste. Im Prinzip ist es aber eigentlich so, dass in den ersten fünf Kapiteln die Grundlagen herausgearbeitet werden, und diese besonders intensiv gelesen werden sollten. Ich weiß nicht, ob eine Zusammenfassung von Inhalten, der sowieso schon im Buch steht, an einer anderen Stelle noch einmal sinnvoll ist … Ich werde darüber nachdenken!
Gruß
Stefan
Ich habe mittlerweile gemerkt das man Absätze in Kapiteln nicht überspringen sollte nur weil sie langweilig anfangen und das so gut wie jeder Absatz wichtig ist.
Das ist wahrscheinlich der Anfänger-Fehler schlechthin wodurch alle anderen Fehler entstehen.
Ich dachte so spar ich Zeit. Aber eigentlich hat es doppelt so lange gedauert weil ich es noch einmal lesen hab müssen.
Also mein Tipp:
Gleich am Anfang groß und fett schreiben:
„Alles lesen! Sonst kannst du’s nochmal lesen! Und nochmal, und nochmal,…“ 😉
Ich gehe doch einmal davon aus (bzw. hoffe es), dass unsere Leser nicht einfach Absätze oder Kapitel überspringen. Deshalb habe ich das auch im Kapitel 00.07.01 Wie lerne ich Programmieren (Java)? erwähnt 😉 .
Dass die Absätze am Anfang „langweilen“ sollte natürlich trotzdem nicht sein. Wenn du für konkrete Formulierungen bessere Sätze parat hast, kannst du mir diese gerne mitteilen.
Gruß
Stefan
Wie sage ich java denn welche Codierung es verwenden soll?
Bzw. Wie finde ich raus welcher Code verwendet wird?
Wenn ich z.B. schreibe: char i = ‚a‘;
In welchem code wird das dann gespeichert?
Char ist doch grundsätzlich 2 byte groß oder? … Also immer unicode? Oder Stimmen unicode und ascII am Anfang (also bei den Lateinischen Zeichen über ein?)
Gruß Eike
Hallo Eike,
ich verweise auf Kapitel 02.03 Primitive Datentypen. Dort wird u. a. erläutert, dass Character in Java in 16 Bit Unicode gespeichert werden.
Die ersten 127 Zeichen stimmen mit dem ASCII-Code überein.
Grüße
Stefan