Use page up/page down (Mac: FN + up/down) to turn pages

Your browser doesn't support the features required by impress.js, so you are presented with a simplified version of this presentation.

For the best experience please use the latest Chrome, Safari or Firefox browser.

Die Selbsthilfegruppe "UTF-8-Probleme" trifft sich diesmal abweichend im grünen Saal.

Heute

Außerdem

Praktische Lebenshilfe rund ums Zeichen:

Was ist ein Encoding?

Für einen Zeichenvorrat (Repertoire) die Zuordnung: Ordnungsnummer (Codepoint) ⇔ Zeichen

Beispiel aus ASCII

Zeichen Codepoint
(dezimal)
hexa­dezimal
[Space] 32 0x20
- 45 0x2D
1 49 0x31
A 65 0x41
a 97 0x61
{ 123 0x7B

7 bit ≙ (theoretisch) 128 Zeichen

Beispiel: ISO-8859-1

Code …0 …1 …2 …3 …4 …5 …6 …7 …8 …9 …A …B …C …D …E …F
0… nicht belegt
1…
2… SP ! " # $ % & ' ( ) * + , - . /
3… 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
4… @ A B C D E F G H I J K L M N O
5… P Q R S T U V W X Y Z [ \ ] ^ _
6… ` a b c d e f g h i j k l m n o
7… p q r s t u v w x y z { | } ~
bis hierhin identisch mit ASCII
8… nicht belegt
9…
A… NBSP ¡ ¢ £ ¤ ¥ ¦ § ¨ © ª « ¬ SHY ® ¯
B… ° ± ² ³ ´ µ · ¸ ¹ º » ¼ ½ ¾ ¿
C… À Á Â Ã Ä Å Æ Ç È É Ê Ë Ì Í Î Ï
D… Ð Ñ Ò Ó Ô Õ Ö × Ø Ù Ú Û Ü Ý Þ ß
E… à á â ã ä å æ ç è é ê ë ì í î ï
F… ð ñ ò ó ô õ ö ÷ ø ù ú û ü ý þ ÿ

Quelle: Wikipedia

8 bit ≙ (theoretisch) 256 Zeichen

Was fehlt?

Windows CP 1252

Code …0 …1 …2 …3 …4 …5 …6 …7 …8 …9 …A …B …C …D …E …F
0… wie ISO 8859-1 und US-ASCII
1…
2… wie ISO/IEC 8859, ISO 8859-1 und US-ASCII
3…
4…
5…
6…
7… wie ISO 8859-1 und US-ASCII
8… ƒ ˆ Š Œ Ž
9… ˜ š œ ž Ÿ
A… wie ISO/IEC 8859-1 und ISO 8859-1
B…
C…
D…
E…
F…

Quelle: Wikipedia

Was fehlt?

⇒ Repertoire muss mehr als 256 Zeichen umfassen dürfen

Mac Roman

Code …0 …1 …2 …3 …4 …5 …6 …7 …8 …9 …A …B …C …D …E …F
wie ASCII
8… Ä Å Ç É Ñ Ö Ü á à â ä ã å ç é è
9… ê ë í ì î ï ñ ó ò ô ö õ ú ù û ü
A… ° ¢ £ § ß ® © ´ ¨ Æ Ø
B… ± ¥ µ π ª º Ω æ ø
C… ¿ ¡ ¬ ƒ « » NBSP À Ã Õ Œ œ
D… ÷ ÿ Ÿ
E… · Â Ê Á Ë È Í Î Ï Ì Ó Ô
F… Apple-Logo () Ò Ú Û Ù ı ˆ ˜ ¯ ˘ ˙ ˚ ¸ ˝ ˛ ˇ

Quelle: Wikipedia

Widersprüche

Beispiel: 0x80 ist nicht belegt in ISO-8859-1, ist in CP-1252 und Ä in Mac Roman.

⇒ Jedes Zeichen muss eine eindeutige Position erhalten.

⇒ nur noch ein Encoding: Unicode

Betrachten wir folgenden Beispielsatz (kommt in jeder Präsentation vor – hier erstmals schwarz auf weiß):

„Äh“

Unicode-Zeichen:

Ä h
Codepoint (dezimal) 8222 196 104 8220
bzw. hexadezimal U+201E U+00C4 U+0068 U+201C

Windows-1252-Zeichen:

Ä h
Codepoint 0x84 0xC4 0x68 0x93
Unicode 0x201E 0xC4 0x68 0x201C

ISO-Latin-1-Zeichen:

" Ä h "
Codepoint 0x22 0xC4 0x68 0x22
Unicode 0x201E 0xC4 0x68 0x201C
Windows-1252 0x84 0xC4 0x68 0x93

Hinterlegung: Zeichen nicht vorhanden, ersetzt

Mac-Roman-Encoding

Ä h
Codepoint 0xE3 0x80 0x68 0xD2
Unicode 0x201E 0xC4 0x68 0x201C
Windows-1252 0x84 0xC4 0x68 0x93
ISO-Latin-1 0x22 0xC4 0x68 0x22

Moment: 0x80 war doch € bei Windows-1252

„Äh“ (Mac-Roman): 0xE3 0x80 0x68 0xD2,
als Windows-1252 interpretiert: ã€hÒ

⇒ eindeutige Postionen nötig, sonst Mojibake (Zeichensalat)

ASCII-Encoding

" A h "
Codepoint 0x22 0x41 0x68 0x22
Unicode 0x201E 0xC4 0x68 0x201C
Windows-1252 0x84 0xC4 0x68 0x93
ISO-Latin-1 0x22 0xC4 0x68 0x22
Mac Roman 0xE3 0x80 0x68 0xD2

Nur h bleibt gleich kodiert.

⇒ Unicode: eindeutiger Codepoint für jedes Zeichen

Unicode ist das bessere Encoding, weil…

⇒ „Sonderzeichen“ war gestern

Außerdem nett: die ersten 256 Zeichen sind Codepoint-identisch mit ISO-8859-1.

Wenn Zeichen ≠ Byte, wie stelle ich Zeichen in Byte dar?

Oder auch: welche Character Encoding Form verwenden?

Erste Ansätze (ca. 1990): 16-bit-Festlängenkodierung (2 Byte pro Zeichen)

z.B. von Windows NT umgesetzt

Probleme:

Byte Order Mark

Reihenfolge der Bytes eines Mehr-Byte-Worts abhängig von der Prozessor-Architektur

Konvention: BOM = U+FEFF (Zero-width no-break space) am Dateianfang.

Little Endian Big Endian
Beispiel x86 Mainframe
BOM in Bits 11111111 01111111 11111110 11111111
BOM in Hex-Bytes xFF xFE xFE xFF

Hinterlegung: Most Significant Bit (MSB)

Regel: Lies die ersten 2 Bytes einer Datei. Wenn [0xFE, 0xFF], dann Big Endian.

UTF (Unicode transformation formats):

Historische 2-Byte Encodings (UCS-2) reichen nicht aus.

Unterschiedliche Byte-Repräsentationen für denselben Codepoint:

Char. Encoding Länge Bytes BOM
UTF-8 variabel 1–4 nicht nötig
UTF-16 variabel 2 oder 4 Fehlen ⇒ BE
UTF-32 fest 4 Fehlen ⇒ BE

UTF-16

⇒ von wegen Festlängenkodierung

UTF-8

UTF-8 verwendet nur einzelne Bytes.

Bits Höchster Codepoint Byte 1 Byte 2 Byte 3 Byte 4
≤ 7 U+007F 0XXXXXXX
≤ 11 U+07FF 110XXXXX 10XXXXXX
≤ 16 U+FFFF 1110XXXX 10XXXXXX 10XXXXXX
≤ 21 U+1FFFFF 11110XXX 10XXXXXX 10XXXXXX 10XXXXXX

X = Bits der der Zahl (z.B. A = 0x41 = 1000001)

Zahl der führenden Einsen = Zahl der Bytes

„Äh“ → UTF-8

Ä h
Codepoint U+201E U+00C4 U+0068 U+201C
Bits 0010 000000 011110 00011 000100 1101000 0010 000000 011100
Anzahl 14 ≤ 16 ⇒ 3 Bytes 8 ≤ 11 ⇒ 2 Bytes 7 ≤ 7 ⇒ 1 Byte 14 ≤ 16 ⇒ 3 Bytes
Aufteilung 11100010 10000000 10011110 11000011 10000100 01101000 11100010 10000000 10011100
Bytes 0xE2 0x80 0x9E 0xC3 0x84 0x68 0xE2 0x80 0x9C

⇒ „Self-synchronizing“: Lies höchstens 4 Byte, dann weißt du Bescheid.

Bytestrom von
„Äh“ → UTF-8, UTF-16BE, UTF-16LE

Ä h
UTF-8 0xE2 0x80 0x9E 0xC3 0x84 0x68 0xE2 0x80 0x9C
UTF-16 Big Endian 0x20 0x1E 0x00 0xC4 0x00 0x68 0x20 0x1C
UTF-16 Little Endian 0x1E 0x20 0xC4 0x00 0x68 0x00 0x1C 0x20

⇒ UTF-8: Kein BOM nötig, da nur einzelne Bytes vorbeirauschen

UTF-8 ist das bessere Character Encoding, weil…

Allerdings brauchen die asiatischen Zeichen mindestens 3 Byte.

XML ist besser als Text (Markdown, …) , weil…

Was kann schon schiefgehen?

UTF-8 als CP-1252 lesen

Es wird technisch

Kein Entrinnen

Wie kommt es zu „grünen“?

Reproduzieren mit UTF-8-fähiger Shell:

echo grünen | iconv -f CP1252  ↩
            | iconv -f CP1252

Windows-1252 als UTF-8 lesen

0x84 in Windows CP 1252: „

0x93 in Windows CP 1252: “

Wie passiert sowas? Entweder Fehler der Anwendung (twitterfeed) oder als CP1252 gespeichert und die Datei als UTF-8 geöffnet.

UTF-8-BOM als ISO lesen

Wenn ein BOM, also U+FEFF, (unnötigerweise) am Anfang einer UTF-8-Datei steht, sieht das in einem Editor, der glaubt, ISO-8859-1 oder CP-1252 zu lesen, so aus:

 (0xEF 0xBB 0xBF)

Organisation von Unicode

Planes

Basic Multilingual Plane

Quelle: Wikipedia

Supplementary Multilingual Plane (U+10000–U+1FFFF)

Am bekanntesten wegen des Blocks Miscellaneous Symbols and Pictographs mit neuen Symbolen aus Unicode 6:

Thumbs up U+1F44D
T-Shirt U+1F455
Pile of Poo U+1F4A9
Dog U+1F415
Love Hotel U+1F3E9

Blocks

Zusammenhängende Gebiete mit einigen dutzend bis einigen 1000 Zeichen, z.B.

QS: Phonetische Zeichen

Redakteur nutzt phonetisches Tastaturlayout und schaltet zu spät zurück.

XPath-2.0-im-Browser-Live-Demo: Mit Regex-Matching IPA extensions und Spacing Modifier Letters anmeckern:

In der Praxis: Schematron-Reports

Problem bei der Block-Aufteilung

Character Classes

Jedes Unicode-Zeichen gehört genau einer Klasse an.

Whitespace-Normalisierung

\s: nur Space, Tab, Newline, Carriage Return

\p{Zs}: auch No-Break Space (U+00A0), …

NFKD-Normalisierung?

Quelle: Unicode-Konsortium

Sortierschlüssel selbst berechnen

Ä wie A sortieren (deutsch): Unicode-Zerlegung und Regex-Ersetzung

Mist! Unicode-Problem (hängt wahrscheinlich damit zusammen, dass Javascript intern UCS-2 nimmt)

Sortieren

Ä wie A sortieren (deutsch) bzw. Ä nach AZ sortieren (österreichisch): Unicode-Zerlegung und Regex-Ersetzung

Bär

Bar

Auto

Batzen

Collations

Man muss nicht immer zu Fuß normalisieren. Mit dem Unicode Collation Algorithm vergleicht man Strings lokalisiert und auf mehreren Ebenen.

Level Description Examples
L1 Base characters role < roles < rule
L2 Accents role < rôle < roles
L3 Case role < Role < rôle
L4 Punctuation role < role < Role
Ln Tie-Breaker role < role < role

Quelle: Unicode-Konsortium

Lokalisierung

Language Swedish: z < ö
German: ö < z
Usage German Dictionary: of < öf
German Telephone: öf < of
Customizations Upper-First A < a
Lower-First a < A

Implementierung z.B. für L1 in Saxon auf deutsch:
<xsl:sort collation="http://saxon.sf.net/collation?lang=de;strength=primary"/>

Danke für Ihre Aufmerksamkeit

Diese Präsentation im Web:

(die Präsentation wird allerdings Mobilgeräte etwas überfordern…)

© 2012 Gerrit Imsieke

Creative Commons License
This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.

One more thing, this just in:

Thanks, @annevk!