12.4 ASCII-Kode
 
ASCII ASCII ist die Abkürzung für American Standard Code for Information Interchange. Insgesamt gibt es 128 solche Zeichen. Jeder Zahl entspricht nach diesem Standard genau ein Zeichen, dabei wird von 0 bis 127 gezählt. So wird z.B. mit der Zahl 65 das Zeichen 'A' kodiert. Allerdings ist diese Verschlüsselung, denn nichts anderes ist eine Kodierung nicht wie in der Kryptologie üblich, geheim, sie ist standardisiert und wird von allen Rechnern benutzt. Um auch andere Zeichen (chinesische, arabische, kyrillische etc. darstellen zu können, reicht der ASCII Code nicht mehr aus. Mittlerweile gibt es den Unicode, der eine Erweiterung des ASCII-Codes darstellt, diesen also als Teilmenge enthält. Java unterstützt von Anfang an diesen Unicode. Wir werden später darauf zurückkommen.

Die Zahlen 0 bis 127 reichen in der Binärdarstellung von 00000000 bis 01111111. Wir erkennen, dass wir die Zeichen in einem Byte also 8 bit unterbringen. und damit das höchste Bit zunächst nicht besetzen. Tatsächlich benutzt man das höchste Bit als Prüfzeichen. Es wird so gesetzt, dass die Anzahl der in der 8 Zeichen umfassenden Speicherbereich vorkommenden 1en eine gerade Zahl ist. Um das Prüfbit per Hand zu setzen, muss man den ASCII-Code in Binärdarstellung kennen.
 

  Wir schreiben ein Programm, das die ASCII-Codierung der Zahlen 0 bis 127 zeigt.
 
Download: ASCII.java public class ASCII {

  public static void main (String[] args) {
    for (int ascii=0; ascii<128; ascii++){
        System.out.println(ascii+": "+(char)ascii);
    }
  }
}
 
  Das Vorsetzen von (char) vor der int-Variablen ascii nennt man explizites Casten. Wir werden uns später eingehender mit dieser Technik beschäftigen. Im Moment soll es uns reichen, zu wissen, dass hier die Interpretation einer Zahl als ein Zeichen erzwungen wird.
 
Tabelle der ASCII-Zeichen
   0:       1: ☺    2: ☻    3: ♥    4: ♦    5: ♣
   6: ♠    7:     8:     9:     10:   11: ♂
  12: ♀   13:    14: ♫   15: ☼   16: ►   17: ◄
  18: ↕   19: ‼   20: ¶   21: §   22: ▬   23: ↨
  24: ↑   25: ↓   26: →   27: ←   28: ∟   29: ↔
  30: ▲   31: ▼   32:   33: !   34: "   35: #
  36: $   37: %   38: &   39: '   40: (   41: )
  42: *   43: +   44: ,   45: -   46: .   47: /
  48: 0   49: 1   50: 2   51: 3   52: 4   53: 5
  54: 6   55: 7   56: 8   57: 9   58: :   59: ;
  60: <   61: =   62: >   63: ?   64: @   65: A
  66: B   67: C   68: D   69: E   70: F   71: G
  72: H   73: I   74: J   75: K   76: L   77: M
  78: N   79: O   80: P   81: Q   82: R   83: S
  84: T   85: U   86: V   87: W   88: X   89: Y
  90: Z   91: [   92: \   93: ]   94: ^   95: _
  96: `   97: a   98: b   99: c  100: d  101: e
 102: f  103: g  104: h  105: i  106: j  107: k
 108: l  109: m  110: n  111: o  112: p  113: q
 114: r  115: s  116: t  117: u  118: v  119: w
 120: x  121: y  122: z  123: {  124: |  125: }
 126: ~  127: ⌂        

Man erkennt, das an manchen Stellen keine Zeichen stehen: Die Zahlen 0, 7 bis 10 und 32 etwa. So steht die 7 für BEL ein Glockenton, den man auch hört, wenn das Programm bei der Ausgabe dieses Zeichen steht. Die Zeichen müssen  nicht unbedingt auf dem Bildschirm stehen, es können z.B. auch Steuerzeichen, z.B. für Drucker etc sein.  Zeichen sind also im abstrakteren Sinne zu verstehen.
 

Übungsbeispiel 2 Schreiben Sie ein Programm, dass die folgende Spezifikation erfüllt. Ein JFrame hat ein editierbares Eingabefeld im 'Norden' und ein nicht editierbares  Ausgabefeld im 'Süden'. Im 'Zentrum' ist ein Button mit der Aufschrift 'Gib aus!'. Drückt man den Button, wird die im Eingabefeld eingetragene Zahl als ASCII-Code interpretiert und das Zeichen im Ausgabefeld ausgegeben. Falsche Eingaben sollen abgefangen werden, wobei das Eingabefeld gelöscht und im Ausgabefeld der Kommentar 'Falsche Eingabe!' erscheint.
   
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class JASCII extends JFrame implements ActionListener{
  // Anfang Variablen
  JButton verschlButton;
  JTextField eingabeFeld, ausgabeFeld;
  // Ende Variablen

  public JASCII (String title) {
    // Frame-Initialisierung
    super (title);
    setDefaultCloseOperation(EXIT_ON_CLOSE);
    setSize(150,150);
    Container cp = getContentPane();
    cp.setLayout(new BorderLayout());

    // Anfang Komponenten
    eingabeFeld = new JTextField("Eingabe");
    eingabeFeld.setHorizontalAlignment(SwingConstants.RIGHT);
    cp.add(eingabeFeld,BorderLayout.NORTH);
    
    verschlButton = new JButton("Generiere Zeichen!");
    cp.add(verschlButton, BorderLayout.CENTER);
    verschlButton.addActionListener(this);
    
    ausgabeFeld = new JTextField();
    ausgabeFeld.setHorizontalAlignment(SwingConstants.RIGHT);
    ausgabeFeld.setEnabled(false);
    cp.add(ausgabeFeld,BorderLayout.SOUTH);
    // Ende Komponenten

    setVisible(true);
  }

  // Anfang Ereignisprozeduren
  public void actionPerformed(ActionEvent e){
    int zahl = Integer.parseInt(eingabeFeld.getText());
    ausgabeFeld.setText(""+(char)zahl);
  }
  // Ende Ereignisprozeduren

  public static void main (String[] args) {
    new JASCII("J-ASCII");
  }
}


 

Applet starten Beim Eintragen von Zahlen, wie etwa 3 oder 4, erkennt man, dass nicht die erwarteten Zeichen erscheinen, eine Eigenheit von Windows. Hier wird nicht über den ganzen Bereich der Standard eingehalten. Gibt man Zahlen über 128 ein, so erkennt man Zeichen des Unicodes.
 
zu 12.5 Übungen
zur Startseite www.pohlig.de  (C) MPohlig 2004