Zeichencodierung
- https://www.youtube.com/watch?v=_mZBa3sqTrI Super Vortrag über Zeichencodierung.
ASCII
Codierung mit 7 Bits, also 128 mögliche Zeichen. Heute auf praktisch allen Geräten unterstützt. Programm-Code und Dateinamen sollten nur aus diesen Zeichen bestehen.
Zeichen 0-31 und 127: Kontrollzeichen (werden nicht angezeigt).
- Erzeugen Sie untenstehende ASCII-Tabelle (es fehlen viele Zeilen im Beispiel) in JavaScript, CSS und HTML. Die Tabelle soll dynamisch nach dem vollständigen Laden der Seite erzeugt werden.
- Die Tabelle soll erst in einem String erzeugt werden, der dann mit 'innerHTML' in ein
div
Element geschrieben wird. - Ist der ASCII-Code als Zahl gegeben, kann dieser mit
String.fromCodePoint(zahl)
in einen String umgewandelt werden. - Kontrollzeichen 0-31 werden nicht angezeigt, es gibt aber Unicode-Zeichen dafür. Deren Code erhält man, indem man
0x2400
addiert. (Funktioniert auch für den Leerschlag). Für ASCII 127 (delete) gibt es den Unicode '0x2421'. - Umwandlung ins Zweierstystem erledigt
zahl.toString(2)
. Führende Nullen kriegt man hin, indem man vorne einfach 7 Nullen hinzufügt, und dann nur die letzten 8 Zeichen derzeichenkette
nimmt, mitzeichenkette.substr(-8)
.
␀ 0 = 0b0000'0000 | ␠ 32 = 0b0010'0000 | @ 64 = 0b0100'0000 | ` 96 = 0b0110'0000 |
␁ 1 = 0b0000'0001 | ! 33 = 0b0010'0001 | A 65 = 0b0100'0001 | a 97 = 0b0110'0001 |
␂ 2 = 0b0000'0010 | " 34 = 0b0010'0010 | B 66 = 0b0100'0010 | b 98 = 0b0110'0010 |
␃ 3 = 0b0000'0011 | # 35 = 0b0010'0011 | C 67 = 0b0100'0011 | c 99 = 0b0110'0011 |
␄ 4 = 0b0000'0100 | $ 36 = 0b0010'0100 | D 68 = 0b0100'0100 | d 100 = 0b0110'0100 |
␅ 5 = 0b0000'0101 | % 37 = 0b0010'0101 | E 69 = 0b0100'0101 | e 101 = 0b0110'0101 |
␟ 31 = 0b0001'1111 | ? 63 = 0b0011'1111 | _ 95 = 0b0101'1111 | ␡ 127 = 0b0111'1111 |
Unicode
- Jedem Zeichen eine Nummer (bereits über 100'000 Zeichen, inkl. Emojis wie 👍 mit der Nummer 0x1F44D).
- Unicode ist einfach eine Zahl, unabhängig davon ob diese dezimal oder hexadezimal notiert wird, und unabhängig davon, wie diese dann effektiv codiert (d.h. gespeichert) wird.
- De facto Standard auf dem Web, MacOS und Linux, wobei immer UTF-8 verwendet wird.
UTF-8
- Heute ist ein Byte auf Computern (fast) immer 8 Bit gross. ASCII passt wunderbar in ein Byte.
- Zahlen über 65'536 brauchen mindestens 17 Bits, wie codieren, d.h. wie die Zahlen mit Bits und Bytes darstellen?
- UTF-32: Immer 4 Bytes pro Zeichen.
- UTF-8: ASCII-Zeichen als 1 Byte
- Andere Zeichen über mehrere Bytes verteilen (so viele wie nötig).
- Erstes Byte gibt u.a. an, wie viele Bytes benötigt werden. (z.B. 0b110x'xxxx heisst 1 Folgebyte, 0b1110'xxxx heisst zwei Folgebytes etc). Die 'x' codieren einen Teil der dem Unicode entsprechenden Zahl.
- Weitere Bytes sind als Folgebytes gekennzeichnet (starten mit 0b10xx'xxxx). Die 'x' codieren einen Teil der dem Unicode entsprechenden Zahl.
UTF-16
- JavaScript verwendet intern UTF-16 (was auch gut war, solange es viel weniger als $2^{16}$ Unicode Zeichen gab.
- 2 Bytes pro Zeichen, gewisse Zeichen müssen auch da in 4 Bytes (d.h. 2x 16 Bits) codiert werden.
- NTFS (das Windows-Filesystem) soll UTF-16 verwenden, wobei offenbar auch von Unicode ausdrücklich nicht zugelassene Kombinationen von Bytes verwendet werden können.
Bool'sche und Bitweise Operationen
Bool'sche Operationen
Bei bool'schen Operationen werden Wahrheitswerte (true
/ false
) miteinander verknüpft. Des Resultat ist ebenfalls wieder ein Wahrheitswert.
Die wichtigsten drei Verknüpfungen sind:
and ''&&'', or ''||'', not ''!''
a | b | a && b | a || b | !a |
---|---|---|---|---|
false | false | false | false | true |
false | true | false | true | true |
true | false | false | true | false |
true | true | true | true | false |
Bitweise Operationen
Natürliche Zahlen werden im Binärsystem gespeichert. Diese Darstellung kann nun bitweise mit anderen zahlen Verknüpft werden. So können Bits einer Zahl extrahiert und oder gesetzt werden.
Die Operatoren sind
&
für and|
für or~
für not^
für xor<<
für shift left>>
für shift right
Beispiele:
5 & 12 = 4
, weil0b0101 & 0b1100 = 0b0100
.5 | 12 = 13
, weil0b0101 & 0b1100 = 0b1101
.5 ^ 12 = 9
, weil0b0101 & 0b1100 = 0b1001
.3 << 3 = 24
, weil0b11 << 3 = 0b11000
(Multiplikation mit $2^3$)42 >> 3 = 5
, weil0b101010 >> 3 = 0b101
(Ganzzahldivision durch $2^3$)
Bit-Extraktion
Bits 3,4 und 5 aus zahl
extrahieren:
(zahl >> 3) & 0b111
.
Bits 3,4 und 5 in zahl
auf neu
setzen (Annahme: Die entsprechenden Bits in zahl
sind 0).
zahl = zahl | (neu << 3);
Bits 3,4 und 5 in zahl
auf neu
setzen (Annahme: Die entsprechenden Bits in zahl
beliebig).
zahl = (zahl & (~(0b111 << 3)) | (neu <<3);