ALL EN FR ES IT

Logo

≡ ▲

Eine optimierte Zeichencodierung

Computerwelt

Ich schlage vor, wir beschränken uns auf "1" und "0" als Alphabet. Die können im MISCNI (minimalistic international standard code for nonsense interchange) trivial codiert werden als:

 Zeichen          Code
   "0"        10000000
   "1"        00000001

Diese Codierung hat den Vorteil, dass sie ein als 1 aus 8-Code immer gleich viele Bits auf 1 hat (auch gut weil damit der Stromverbrauch konstant ist - das macht die Netzteilregelung einfacher und verhindert zuverlässig das Abhören von zum Beispiel Cryptoalgorithmen auf Chipkarten durch Messen des Stromverbrauchs) und gleichzeitig durch ein Paritätsbit gesichert ist.

Dieser Code lässt sich wunderbar huffman-codieren, L=8 R=1:

 Zeichen          Code      Komprimiert
   "0"        10000000                0
   "1"        00000001                1

Um nun internationale Alphabete zu unterstützen, können wir ein Multiword-Encoding einführen, zum Beispiel aus 8 Zeichen nach folgendem Verfahren (ATATF-8):

                      gua  ps1  ps2  ps3  uls  lrs  cha  fba
                       |    |    |    |    |    |    |    |
guard word        -----'    |    |    |    |    |    |    |
                            |    |    |    |    |    |    |
page selector 1   ----------'    |    |    |    |    |    |
page selector 2   ---------------'    |    |    |    |    |
page selector 3   --------------------'    |    |    |    |
                                           |    |    |    |
upper/lower sel . -------------------------'    |    |    |
left/right sel.   ------------------------------'    |    |
charm             -----------------------------------'    |
foobar            ----------------------------------------'

Zur Erklärung: Diese Zeichen-Metacodierung sieht drei Gruppen von Wörtern vor, um ein Multiwort zu bezeichnen: Das Guard-word dient nur der Sicherung (s.u.), die page selector-Wörter bezeichnen eine von acht möglichen Code-Seiten die ihrerseits in einen oberen und unteren sowie einen linken und einen rechten Teil eingeteilt werden. Jedes dieser vier Felder ist zur Hälfte charmant und zur Hälfte rüpelhaft und darüber hinaus halb foo und halb bar. Damit kann nun in der Seite ein Zeichen ausgewählt werden, wobei gilt:

  uls="0" <-> upper        uls="1" <-> lower
  lrs="0" <-> links        lrs="1" <-> rechts
  cha="0" <-> ruepelhaft   cha="1" <-> charmant
  fba="0" <-> foo          fba="1" <-> bar

Die Seiten sind nun folgendermaßen belegt:

Erste Page - Scheuerzeichen 1

ps1 "0"  10000000                                        GWM: =
ps2 "0"  10000000
ps3 "0"  10000000
          |          left           |          right          |
          | ruepelhaft :  charmant  | ruepelhaft :  charmant  | 
----------|------------:------------|------------:------------|
      foo |    NUL     :    NU      |    EOT     :    NU      |
upper  . .|. . . . . . : . . . . . .|. . . . . . : . . . . . .|
      bar |    NU      :    INT     |    NU      :    BELL    |
.........|............:............|............:............|
      foo |    BS      :    LF      |    NU      :    NU      |
lower  . .|. . . . . . : . . . . . .|. . . . . . : . . . . . .|
      bar |    TAB     :    NU      |    CR      :    NU      |
----------|------------:------------|------------:------------|
NU: Nothing useful
NUL: Nil
INT: Interrupt setzen
EOT: End of thread - wenn er zu unsinnig wird
BELL: macht "wuff! wuff!" in einem screen(1)
BS: Backspace
TAB: TAbu-Bruch
LF: Linie fuettern
CR: Karossenheimkehr

Zweite Page - Scheuerzeichen 2

ps1 "0"  10000000                                        GWM: !
ps2 "0"  10000000
ps3 "1"  00000001
          |          left           |          right          |
          | ruepelhaft :  charmant  | ruepelhaft :  charmant  | 
----------|------------:------------|------------:------------|
      foo |    NU      :    NU      |    NU      :    NU      |
upper  . .|. . . . . . : . . . . . .|. . . . . . : . . . . . .|
      bar |    NU      :    NU      |    NU      :    NU      |
.........|............:............|............:............|
      foo |    NU      :    NU      |    NU      :    NU      |
lower  . .|. . . . . . : . . . . . .|. . . . . . : . . . . . .|
      bar |    NU      :    FLU     |    NU      :    NU      |
----------|------------:------------|------------:------------|
NU: Nothing useful
FLU: Fluchttaste

Dritte Page - Diakritische Zeichen 1

ps1 "0"  10000000                                        GWM: !
ps2 "1"  00000001
ps3 "0"  10000000
          |          left           |          right          |
          | ruepelhaft :  charmant  | ruepelhaft :  charmant  | 
----------|------------:------------|------------:------------|
      foo |    SPA     :      "     |     $      :     &      |
upper  . .|. . . . . . : . . . . . .|. . . . . . : . . . . . .|
      bar |     !      :      #     |     %      :     '      |
.........|............:............|............:............|
      foo |     (      :      *     |     ,      :     .      |
lower  . .|. . . . . . : . . . . . .|. . . . . . : . . . . . .|
      bar |     )      :      +     |     -      :     /      |
----------|------------:------------|------------:------------|

Vierte Page - Ziffern und diakritische Zeichen 2

ps1 "0"  10000000                                        GWM: =
ps2 "1"  00000001
ps3 "1"  00000001
          |          left           |          right          |
          | ruepelhaft :  charmant  | ruepelhaft :  charmant  | 
----------|------------:------------|------------:------------|
      foo |     0      :      2     |     4      :      6     |
upper  . .|. . . . . . : . . . . . .|. . . . . . : . . . . . .|
      bar |     1      :      3     |     5      :      7     |
.........|............:............|............:............|
      foo |     8      :      :     |     <      :      >     |
lower  . .|. . . . . . : . . . . . .|. . . . . . : . . . . . .|
      bar |     9      :      ;     |     =      :      ?     |
----------|------------:------------|------------:------------|

Fünfte Page - Grossbuchstaben 1

ps1 "1"  00000001                                        GWM: !
ps2 "0"  10000000
ps3 "0"  10000000
          |          left           |          right          |
          | ruepelhaft :  charmant  | ruepelhaft :  charmant  | 
----------|------------:------------|------------:------------|
      foo |     @      :     B      |     D      :     F      |
upper  . .|. . . . . . : . . . . . .|. . . . . . : . . . . . .|
      bar |     A      :     C      |     E      :     G      |
.........|............:............|............:............|
      foo |     H      :     J      |     L      :     N      |
lower  . .|. . . . . . : . . . . . .|. . . . . . : . . . . . .|
      bar |     I      :     K      |     M      :     O      |
----------|------------:------------|------------:------------|

Sechste Page - Grossbuchstaben 2 und diakritische Zeichen 3

ps1 "1"  00000001                                        GWM: =
ps2 "0"  10000000
ps3 "1"  00000001
          |          left           |          right          |
          | ruepelhaft :  charmant  | ruepelhaft :  charmant  | 
----------|------------:------------|------------:------------|
      foo |     P      :     R      |     T      :     V      |
upper  . .|. . . . . . : . . . . . .|. . . . . . : . . . . . .|
      bar |     Q      :     S      |     U      :     W      |
.........|............:............|............:............|
      foo |     X      :     Z      |     \      :     ^      |
lower  . .|. . . . . . : . . . . . .|. . . . . . : . . . . . .|
      bar |     Y      :     [      |     ]      :     _      |
----------|------------:------------|------------:------------|

Siebente Page - Kleinbuchstaben 1

ps1 "1"  00000001                                        GWM: =
ps2 "1"  00000001
ps3 "0"  10000000
          |          left           |          right          |
          | ruepelhaft :  charmant  | ruepelhaft :  charmant  | 
----------|------------:------------|------------:------------|
      foo |     `      :     b      |     d      :     f      |
upper  . .|. . . . . . : . . . . . .|. . . . . . : . . . . . .|
      bar |     a      :     c      |     e      :     g      |
.........|............:............|............:............|
      foo |     h      :     j      |     l      :     n      |
lower  . .|. . . . . . : . . . . . .|. . . . . . : . . . . . .|
      bar |     i      :     k      |     m      :     o      |
----------|------------:------------|------------:------------|

Achte Page - Kleinbuchstaben 2 und diakritische Zeichen 4

ps1 "1"  00000001                                        GWM: !
ps2 "1"  00000001
ps3 "1"  00000001
          |          left           |          right          |
          | ruepelhaft :  charmant  | ruepelhaft :  charmant  | 
----------|------------:------------|------------:------------|
      foo |     p      :     r      |     t      :     v      |
upper  . .|. . . . . . : . . . . . .|. . . . . . : . . . . . .|
      bar |     q      :     s      |     u      :     w      |
.........|............:............|............:............|
      foo |     w      :     y      |     {      :     }      |
lower  . .|. . . . . . : . . . . . .|. . . . . . : . . . . . .|
      bar |     x      :     z      |     |      :     NU     |
----------|------------:------------|------------:------------|

Guard word

Nun zum guard word. Jede Seite in der Aufstellung oben ist mit einer Guard Word Method (GWM) - "!" oder "=" markiert. Aus der Position in der Seite lässt sich ein Guard Word Methodenargument (GWMA) - "U" oder "G" ablesen:

          |          left           |          right          |
          | ruepelhaft :  charmant  | ruepelhaft :  charmant  | 
----------|------------:------------|------------:------------|
      foo |     G      :     U      |     U      :     G      |
upper  . .|. . . . . . : . . . . . .|. . . . . . : . . . . . .|
      bar |     U      :     G      |     G      :     U      |
.........|............:............|............:............|
      foo |     U      :     G      |     G      :     U      |
lower  . .|. . . . . . : . . . . . .|. . . . . . : . . . . . .|
      bar |     G      :     U      |     U      :     G      |
----------|------------:------------|------------:------------|

Das guard word ergibt sich nach folgender Tabelle:

   GWM  |  GWMA  |  guard word  |  code 
  ------+--------+--------------+------------
    =   |    G   |      "0"     |  10000000
    =   |    U   |      "1"     |  00000001
    !   |    G   |      "1"     |  00000001
    !   |    U   |      "0"     |  10000000

Putten wir also alles together...

Das "A" wuerde also in ATATF-8 so codiert:

 Guard word ! | U :
                             gua = 10000000
 Fuenfte Page:
 GWM: !                      ps1 = 10000000
                             ps2 = 00000001
                             ps3 = 00000001
 Oben links ruepelhaft bar:
 GWMA: U                     uls = 10000000
                             lrs = 10000000
                             cha = 10000000
                             bar = 00000001

Das lässt sich komprimiert darstellen als:

 01000001

also in nur einem 8Bit-Wort. Mein Vorschlag, als universelles Alphabet einfach "0" und "1" zu verwenden, hat also den Vorteil, schon bei bloß trivialer Kompression keinen zusätzlichen Overhead im Vergleich zum herkömmlichen Verfahren zu haben!


Aus dem Usenet von Alexander Talos <at(at)atat.at> im August 2002