Unicode und UTF-8
Transcription
Unicode und UTF-8
Unicode und UTF-8 Anna-Katharina Wurst 28. April 2015 WP5 Angewandte Programmierung David Kaumanns & Sebastian Ebert SoSe 2015 CIS Ludwig-Maximilians-Universität München Unicode und UTF-8 Anna-Katharina Wurst Inhalt 1 Zeichensätze ASCII ISO 8859-x Unicode 2 Kodierung UTF-8 3 Anwendung PERL 2 Unicode und UTF-8 Anna-Katharina Wurst Inhalt 1 Zeichensätze ASCII ISO 8859-x Unicode 2 Kodierung UTF-8 3 Anwendung PERL 3 ASCII-Kodierung American Standard Code for Information Interchange 1963 als Zeichensatz-Standard veröffentlicht Unicode und UTF-8 Anna-Katharina Wurst 7 Bit Zeichen-Kodierung definiert 128 Zeichen: 33 Steuerzeichen und 95 druckbare Zeichen: (ASCII-Tabelle) !#"$%&’()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNO PQRSTUVWXYZ[\]^_ ‘abcdefghijklmnopqrstuvwxyz{ | } ~ A (dezimal): 65 A (binär): 100 0001 a (dezimal): 97 a (binär): 110 0001 4 ISO 8859-x verschiedene Erweiterungen von ASCII auf einen 8-Bit-Code Unicode und UTF-8 Anna-Katharina Wurst z.B. ISO 8859-1 (ISO Latin-1) für Westeuropa z.B. ISO 8859-2 (ISO Latin-2) für Mitteleuropa zusätzliche Kodierungen von sprachspezifischen Zeichen (z.B. Umlaute) Probleme bei internationaler Kommunikation durch die inkompatiblen Kodierungssysteme 5 Unicode Unicode und UTF-8 Anna-Katharina Wurst internationaler Zeichensatz-Standard, in dem für jedes Schriftzeichen der Welt ein digitaler Codepoint festgelegt wird die inkompatiblen Kodierungen verschiedener Zeichensätze sollen beseitigt werden Kodierung durch UTF-32 (32 Bit pro Zeichen), UTF-16 (16 oder 32 Bit pro Zeichen) oder UTF-8 (8, 16, 24, 32 Bit pro Zeichen) 6 Unicode und UTF-8 Anna-Katharina Wurst Inhalt 1 Zeichensätze ASCII ISO 8859-x Unicode 2 Kodierung UTF-8 3 Anwendung PERL 7 UTF-8 Unicode und UTF-8 Anna-Katharina Wurst Abkürzung für 8-Bit UCS Transformation Format (UCS = Universal Character Set = Unicode) Einführung 1992 durch Ken Thompson und Rob Pike Kodierungsalgorithmus für Unicode-Zeichen Multi-Byte-Zeichenkodierung (MBCS) mit variablen Bytelängen 8 Unicode und UTF-8 Anna-Katharina Wurst UTF-8-Zeichenkodierung jedem Unicode-Zeichen wird eine speziell kodierte Zeichenkette variabler Länge zugeordnet zugelassen sind Bytefolgen bis zu einer Länge von 4 Bytes, auf die sich alle Unicode-Zeichen abbilden lassen ein Start-Byte, bis zu drei Folge-Bytes 9 UTF-8-Zeichenkodierung Unicode und UTF-8 Anna-Katharina Wurst Unicode in UTF-8 ist in den ersten 128 Zeichen identisch mit ASCII (1-Byte-Zeichen, höchstes Bit ist 0) Unicode-Bereich (hexadezimal): 0000 0000 ... 0000 007F UTF-8-Kodierung (binär): 0xxxxxxx A (ASCII, UTF-8): 01000001 deutsche Umlaute brauchen 2 Bytes ä (Unicode, hexadezimal): 0000 00E4 ä (UTF-8, binär): 11000011 10100100 kyrillische und fernöstliche Sprachen belegen bis zu 4 Bytes je Zeichen 10 UTF-8-Algorithmus ein Start-Byte, bis zu drei Folge-Bytes Start-Bytes beginnen mit 0 oder 11, Folge-Bytes immer mit 10 Unicode und UTF-8 Anna-Katharina Wurst Ist das höchste Bit des ersten Bytes 0, handelt es sich um ein ASCII-Zeichen. A (ASCII, UTF-8): 01000001 Ist das höchste Bit des ersten Bytes 1, handelt es sich um ein Mehrbytezeichen. ä (UTF-8, binär): 11000011 10100100 Bei den Startbytes gibt die Anzahl der 1-Bits die gesamte Bytezahl des Mehrbyte-Zeichens an. 110xxxxx 10xxxxxx 1110xxxx 10xxxxxx 10xxxxxx 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx 11 Vorteile und Nachteile Vorteile Unicode und UTF-8 Anna-Katharina Wurst kein größerer Speicherbedarf für englische Texte Bytestrom ist in beiden Richtungen bzw. auch in der Mitte lesbar (im Gegensatz zu anderen MBCS), da Start- und Folgebytes eindeutig unterscheidbar sind Kodierungs-Reserve vorhanden Nachteile notwendige Analyse jedes Bytes (im Vergleich zu Zeichenkodierungen mit fester Byteanzahl) mehr Rechenaufwand und für bestimmte Sprachen u.U. mehr Speicherplatz 12 Unicode und UTF-8 Anna-Katharina Wurst Inhalt 1 Zeichensätze ASCII ISO 8859-x Unicode 2 Kodierung UTF-8 3 Anwendung PERL 13 Terminal Befehl $ locale zeigt die aktuellen locale-Einstellungen Unicode und UTF-8 Anna-Katharina Wurst LANG=de_DE.UTF-8 LANGUAGE=de_DE ... LC_ALL= Variable LC_ALL legt Kodierung für alle Umgebungsvariablen (bis auf LANGUAGE) fest Befehl $ locale -a zeigt die aktuell verfügbaren locales an vorher: $ date –> Mi 22. Apr 18:00:18 CEST 2015 Befehl export LC_TIME=en_GB.utf8 ändert Umgebungsvariable nachher: $ date –> Wed Apr 22 18:04:19 CEST 2015 Befehl sudo locale-gen fr_FR.UTF-8 fügt neue Locales hinzu 14 Perl Unicode und UTF-8 Anna-Katharina Wurst Operationen in Perl unterscheiden zwischen Strings als Text (z.B. bei substr und regulären Ausdrücken) und Strings als Binärdaten (bei print und Filehandles). PERLs default-Einstellungen passen eigentlich, aber „best practice“ ist „always encode and decode at the edges of your program“ Text, den ein Perl-Programm einliest, sollte explizit dekodiert werden. Text, den ein Perl-Programm ausgibt, sollte explizit kodiert werden. 15 Perl Ausgabe Warnmeldung bei Sonderzeichen: Unicode und UTF-8 Anna-Katharina Wurst Wide character in print at Perl-Programm.plx line 21. um die Warnung zu verhindern, Kodierung für STDOUT auf UTF-8 setzen: binmode (STDOUT, ":encoding(utf8)"); dann muss aber auch die UTF-8 Kodierung und Dekodierung für Filehandles entsprechend festgelegt werden (nächste Folie) sowie die UTF-8-Kodierung des Programmtextes im Header: use utf8; 16 Perl Filehandle Dekodieren: # UTF-8 Dekodierung für Input-Filestream: open (my $in_file, "<:encoding(utf8)", $filename); Unicode und UTF-8 Anna-Katharina Wurst oder: # Input-Filestream erstellen open(my $in_file, "<", $filename); # UTF-8-Dekodierung binmode($in_file, ":encoding(utf8)"); Kodieren: # UTF-8-Kodierung für Output-Filestream open (my $out_file, ">:encoding(utf8)", $filename); oder: open(my $out_file, ">", $filename); binmode($out_file, ":encoding(utf8)"); 17 Perl Sortierung Unicode und UTF-8 Anna-Katharina Wurst my @woerter = ("aber", "beta", "ähnlich", "arthur"); my @sort_woerter = sort (@woerter); print "@sort_woerter \n"; Ausgabe per default: aber arthur beta ähnlich deutsche Sortierung mit: use locale; aber ähnlich arthur beta 18 Zusammenfassung ASCII und Unicode sind Zeichensätze Unicode legt für jedes Schriftzeichen einen Codepoint fest Unicode und UTF-8 Anna-Katharina Wurst mit UTF-8 kann Unicode kodiert werden UTF-8 ist eine Multi-Byte-Zeichenkodierung mit variablen Bytelängen Start-Byte und Folge-Bytes pro Zeichen bei der Anwendung Umgebungsvariablen und Locales anpassen explizites Dekodieren und Kodieren 19 Quellen und Literatur Gumm, Heinz P. & Manfred Sommer: Einführung in die Informatik. München: Oldenbourg 2006. (Kapitel 1.3 Informationsdarstellung) Unicode und UTF-8 Anna-Katharina Wurst http://www.joelonsoftware.com/articles/Unicode.html http://www.perl.com/pub/2012/05/perlunicook-make-file-iodefault-to-utf-8.html http://en.wikibooks.org/wiki/Perl_Programming/Unicode_ UTF-8 http://www.utf8-zeichentabelle.de/ (Unicode-Zeichennamen und verschiedene Darstellungsformate für UTF-8-Codierung) https://www.youtube.com/watch?v=MijmeoH9LT4 20