Babylonisches Sprachverwirrung

oder

Warum erhalte ich kryptische Zeichen, wenn ich Benutzereingabe in einer Datenbank speichere

Gliederung
  • Geschichte der Zeichencodierung
  • Begriffe
  • Codierung im Web
  • Codierung in Datenbanken
  • In der Praxis

Geschichte

Die Zeit vor dem Computer

Geschichte

Computerzeitalter

Unicode

Was ist Unicode

UTF-8

Unicode durch die Lupe

Unicode-Bereich UTF-8-Kodierung Bemerkungen Möglichkeiten

(theoretisch)

0000 0000 – 0000 007F 0xxxxxxx In diesem Bereich (128 Zeichen) entspricht UTF-8 genau dem ASCII-Code: Das höchste Bit ist 0, die restliche 7-Bit-Kombination ist das ASCII-Zeichen. 27 128
0000 0080 – 0000 07FF 110xxxxx 10xxxxxx Das erste Byte enthält binär 11xxxxxx, die folgenden Bytes 10xxxxxx; die x stehen für die fortlaufende Bitkombination des Unicode-Zeichens. Die Anzahl der Einsen vor der höchsten 0 im ersten Byte ist die Anzahl der Bytes für das Zeichen. (In Klammern jeweils die theoretisch maximal möglichen.) 211 − 27
(211)
1920
(2048)
0000 0800 – 0000 FFFF 1110xxxx 10xxxxxx 10xxxxxx 216 − 211
(216)
63.488
(65.536)
0001 0000 – 0010 FFFF [0001 0000 – 001F FFFF] 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx 220
(221)
1.048.576
(2.097.152)
[3]

Signs

Beispiele für UTF-8 Kodierungen
Zeichen Unicode Unicode binär UTF-8 binär UTF-8 hexadezimal Darstellung bei eingestelltem ISO-8859-1-Encoding
Buchstabe y U+0079 00000000 01111001 01111001 0x79 y
Buchstabe ä U+00E4 00000000 11100100 11000011 10100100 0xC3 0xA4 ä
Zeichen für eingetragene Marke ® U+00AE 00000000 10101110 11000010 10101110 0xC2 0xAE ®
Eurozeichen U+20AC 00100000 10101100 11100010 10000010 10101100 0xE2 0x82 0xAC â�¬
Violinschlüssel 𝄞 U+1D11E 00000001 11010001 00011110 11110000 10011101 10000100 10011110 0xF0 0x9D 0x84 0x9E ð���
[4]

Im Web

DB - Webserver - Browser

Im Web

Der Browser

Im Web

Festlegung der Kodierung

Im Web

Webservercodierung [6]

Im Web

Dokumenttyp

Datenbanken [7]

Konfigvariablen

Charset

Zeichenkodierung [8]

Collation

Sortierung [9]

		mysql> SHOW CHARACTER SET;
		+----------+-----------------------------+---------------------+--------+
		| Charset  | Description                 | Default collation   | Maxlen |
		+----------+-----------------------------+---------------------+--------+
		| big5     | Big5 Traditional Chinese    | big5_chinese_ci     |      2 |
		| dec8     | DEC West European           | dec8_swedish_ci     |      1 |
		| cp850    | DOS West European           | cp850_general_ci    |      1 |
		| hp8      | HP West European            | hp8_english_ci      |      1 |
		| koi8r    | KOI8-R Relcom Russian       | koi8r_general_ci    |      1 |
		| latin1   | cp1252 West European        | latin1_swedish_ci   |      1 |


		mysql> SHOW COLLATION LIKE 'latin1%';
		+---------------------+---------+----+---------+----------+---------+
		| Collation           | Charset | Id | Default | Compiled | Sortlen |
		+---------------------+---------+----+---------+----------+---------+
		| latin1_german1_ci   | latin1  |  5 |         |          |       0 |
		| latin1_swedish_ci   | latin1  |  8 | Yes     | Yes      |       1 |
		| latin1_danish_ci    | latin1  | 15 |         |          |       0 |
		| latin1_german2_ci   | latin1  | 31 |         | Yes      |       2 |
		| latin1_bin          | latin1  | 47 |         | Yes      |       1 |

Konventionen

latin1_swedish_ci

Umwandlung

Transkodierungen [10]

Unicodeunterstützung im MySQL

ucs2 vs. utf8

Codierung in Tabellen

 CREATE TABLE `kelvin`.`utf8_test` (
`feld1` VARCHAR( 1 ) CHARACTER SET ascii COLLATE ascii_general_ci NOT NULL ,
`feld2` VARCHAR( 1 ) CHARACTER SET latin1 COLLATE latin1_german1_ci NOT NULL ,
`feld3` VARCHAR( 1 ) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL
) ENGINE = MYISAM CHARACTER SET ucs2 COLLATE ucs2_bin

Die Praxis

Testszenario - Gästebuch

  • Server schickt Formular an Browser
  • Browser schickt Formulardaten zurück an Server
  • Server schickt Daten an Datenbank
  • Datenbank schickt Daten zurück an Server
  • Ausgabe an Browser

Server

Codierung festlegen

HTTP/1.x 200 OK
Date: Fri, 05 Dec 2008 08:49:07 GMT
Server: Apache/2.2.8 (Ubuntu) PHP/5.2.4-2ubuntu5.3 with Suhosin-Patch
Last-Modified: Thu, 04 Dec 2008 16:29:48 GMT
Etag: "2d33-3054-45d3b11af5700"
Accept-Ranges: bytes
Content-Length: 12372
Keep-Alive: timeout=15, max=100
Connection: Keep-Alive
Content-Type: text/html; charset=UTF-8

Browser sendet

Zeichensatz

  • Zeichencodierung angeben, mit der Browser Daten sendet
  • accept-charset - kommagetrente Liste erlaubter charsets
  • Browser arbeiten unterschiedlich - nur ein charset angeben
  • <form acion="index.php" method="post" accept-charset="utf-8">
  • charset identisch mit charset in HTTP-Header

An die Datenbank

Encoding zw. Server und Datenbank [11]

  • Connection encoding - SET NAMES 'UTF-8'
  • Client versendet SQL-Anweisungen im Zeichensatz UTF-8
  • Ergebnisse werden in UTF-8 zurückgesendet
  Gleichbedeutend mit folgenden Anweisungen

  SET character_set_client = UTF-8;
  SET character_set_results = UTF-8;
  SET character_set_connection = UTF-8;
  

An die Datenbank - 2

Alternativ

  • Connection encoding - SET CHARACTER SET UTF-8
  • Zeichensatz und Sortierreihenfolge auf Datenbank
   Gleichbedeutend mit folgenden Anweisungen

   SET character_set_client = x;
   SET character_set_results = x;
   SET collation_connection = @@collation_database;

Umwandlung mit PHP

Nach UTF8

  • utf8_encode - Codiert ISO-8859-1 nach UTF-8
  • Überprüfung auf UTF8 vor Codierung
  • Doppelte Codierung erzeugt Zeichensalat

Umwandlung mit PHP

und umgekehrt

  • utf8_decode - Codiert UTF-8 nach ISO-8859-1
  • iconv - UNIX-iconv von beliebig nach beliebig
  • mbstring - "Zauberstab", überschreibt viele PHP-String-Funktionen per default nicht in PHP enthalten; Unstabil ?!? [12]