Textverarbeitung Text Processing
Total Page:16
File Type:pdf, Size:1020Kb
Textverarbeitung Text Processing Dipl. Math. F. Braun Universität Regensburg Rechenzentrum https://homepages.uni- regensburg.de/~brf09510/EDV/kurs_info/brf09510/kurs_info/textproc/textproc.html https://homepages.uni- regensburg.de/~brf09510/EDV/kurs_info/brf09510/kurs_info/textproc/textproc.pdf svn/doku/trunk/textproc/textproc.tex 9. Dezember 2019 KAPITEL 1 Zeichensätze, Zeichencodes und encodings 1. Webseiten über den Unicode One Code to rule them all, One Code to nd them, One Code to bring them in, and in the darkness bind them Bemerkung: Tengwar, die Elbenschrift, in der dieser böse Spruch geschrieben wurde, hat im Unicode die Code- points U+016080 bis U+0160FF. http://www.unicode.org/roadmaps/smp/ Das Tengwar-Projekt scheint jedoch seit 1997 zu ruhen. Der Unicode Standard 12.1.0: https://www.unicode.org/versions/Unicode12.1.0/ http://www.unicode.org/versions/Unicode12.0.0/UnicodeStandard-12.0.pdf und seine jüngeren und älteren Brüder: http://www.unicode.org/versions/ Joel Spolsky: The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Un- icode and Character Sets (No Excuses!), 2003 http://www.joelonsoftware.com/articles/Unicode.html Dr. Florian Deiÿenböck: No Such Thing As Plain Text, 2015 https://www.cqse.eu/en/blog/no-such-thing-as-plain-text/ QbProg: Do you really want me to write code like that?! Unicode and your application, Sunday, November 11, 2012 http://cppwhispers.blogspot.de/2012/11/unicode-and-your-application-1-of-n.html ICU hat ein Tag bei stackoverow: http://stackoverflow.com/questions/tagged/icu 2. Geschichte Robert Bemer: https://www.thocp.net/biographies/bemer_bob.htm Robert Bemer: Survey of coded character representation https://dl.acm.org/citation.cfm?id=367493 Full text as PDF Bob Bemer: HOW ASCII GOT ITS BACKSLASH 3 4 1. ZEICHENSÄTZE, ZEICHENCODES UND ENCODINGS 1960 Ascii, ASA, American Standards Association, X3.2 1986 ANSI X3.4-1986, ISO/IEC 646:1991, ECMA-6 1987,1998-2003 ISO 8859 zu spät und zu wenig! ISO/IEC 8859-1:1998, ISO/IEC 8859-2:1999 ISO/IEC 8859-3:1999, ISO/IEC 8859-4:1998, ISO/IEC 8859-5:1999, ISO/IEC 8859-6:1999, ISO/IEC 8859-7:2003, ISO/IEC 8859-8:1999, ISO/IEC 8859-9:1999, ISO/IEC 8859-10:1998, ISO/IEC 8859-11:2001, ISO/IEC 8859-12 eingestellt, ISO/IEC 8859-13:1998, ISO/IEC 8859-14:1998, ISO/IEC 8859-15:1999, ISO/IEC 8859-16:2001 1991 Unicode 1.0.0 1992 Unicode 1.0.1 1993 Unicode 1.1.0, ISO/IEC 10646:1993 1995 Unicode 1.1.5 1996 Unicode 2.1.0, ISO/IEC 10646-1:1993+Amendment 5/7 1998 Unicode 2.1.2 1998 Unicode 2.1.5 1998 Unicode 2.1.8 1999 Unicode 2.1.9 1999 Unicode 3.0.0, ISO/IEC 10646-1:2000 2000 Unicode 3.0.1 2001 Unicode 3.1.0, ISO/IEC 10646-1/2:2001 2001 Unicode 3.1.1 2002 Unicode 3.2.0, ISO/IEC 10646-1/2:2001+Amendment 1 2003 Unicode 4.0.0, ISO/IEC 10646:2003 2004 Unicode 4.0.1 2005 Unicode 4.1.0 2006 Unicode 5.0.0 2008 Unicode 5.1.0 2009 Unicode 5.2.0 2010 Unicode 6.0.0, ISO/IEC 10646:2011 2012 Unicode 6.1.0, ISO/IEC 10646:2012 2012 Unicode 6.2.0 2013 Unicode 6.3.0 2014 Unicode 7.0.0 2015 Unicode 8.0.0, ISO/IEC 10646:2014 2016 Unicode 9.0.0, ISO/IEC 10646:2015, 4. ed. 2017 Unicode 10.0.0, ISO/IEC 10646:2017; Bitcoin, CJK 2018 Unicode 11.0.0, ISO/IEC 10646:2017; Copyleft, Chinese chess 2019 Unicode 12.0.0, ISO/IEC 10646:2017. 5. ed.; small hiragana and katagana, tamil, lao, hieroglyphs Der Unicode enthält heute als 21-Bit-Code etwas über 2 Millionen Zahlen. Sie werden nicht alle als Codepoints (s.u.) verwendet: in Gebrauch sind lediglich etwas über 1 Million Codepoints mit Nummern zwischen 0 und 10FFFF. Sie werden in 17 Ebenen gegliedert; die base plane enthält die 65536 (sehr häugen) Codepoints von 0 bis FFFF. Weitere Zeichen verteilen sich auf die 16 weiteren supplementary planes. Bisher wurden davon nur 5 Ebenen (1, 2, 14, 15, 16) deniert; 11 davon (3-13) sind für künftigen Erweiterungen noch frei. Die Ebenen sind nicht lückenlos mit Schriftzeichen gefüllt und enthalten nicht ausschlieÿlich Schriftzeichen. In den ersten drei Ebenen sind daher in Version 10 (2017) von den hier theoretisch möglichen 196608 Schriftzeichen (3 · 216) 136690 Zeichen in 139 Schriftsystemen verfügbar. 3. Begrie http://www.joelonsoftware.com/articles/Unicode.html Joel Spolsky: The Absolute Minimum Every Soft- ware Developer Absolutely, Positively Must Know About Unicode and Character Sets, 2003 http://www.gymel.com/charsets/ Zeichentabellen, 2001 http://czyborra.com/charsets/ Czyborra: charsets, 1998 http://userguide.icu-project.org/unicode ICU, _die_ Unicode Library http://scripts.sil.org/cms/scripts/page.php?site_id=nrsi&id=IWS-Chapter03 Peter Constable, Cha- racter set encoding basics, 2001-06-13 3. BEGRIFFE 5 http://www.goland.org/unicode_c_windows/ Unicode, Windows and C++, 2012 Ein Zeichensatz (character set oder character repertoire) ist eine exakt festgelegte Menge S verschiedener Schriftzeichen. Hier sind noch keine Zeichennummern im Spiel. Der Unicode-Zeichensatz als Beispiel ist wirk- lich sehr umfangreich. Kleiner sind die Menge der 26 lateinischen Buchstaben, das kyrillische oder griechische Alphabet und DIN 66003 bez. DIN 66303. Ein Zeichencode (ccs, coded character set) ist ein Zeichensatz S mit einer bijektiven (injektiv und surjektiv) Abbildung zwischen den Schriftzeichen des Zeichensatzes und einer Codemenge M (Byte, endliche Teilmenge der ganzen Zahlen . ). Die Menge M heiÿt auch codespace oder codepage mit dem dizilen Unterschied, daÿ der codespace eher die Codemenge M und die codepage die Zeichenmenge S beschreibt. Im Unicode besteht M aus einer Teilmenge der ganzen Zahlen 0 - 2097151 = 221 − 1, die in maximal 21 Bit gespeichert werden können. Für weniger mit mathematischer Sprache Vertraute ist der Zeichencode einfach eine willkürliche Durchnum- merierung der in Zeichensatz festgelegten Schriftzeichen, d.h. jedes Schriftzeichen bekommt eine eindeutige Nummer aus der Codemenge M. Die Nummerierung ist nicht zwingend lückenlos. Ein codepoint oder encoded character ist ein Element der Codemenge M, das ein Schriftzeichen aus S bezeichnet. Man kann also das Schriftzeichen oder seinen codepoint angeben. Ein Beispiel ist das Eurozeichen e mit der Nummer 8364 im Unicode. Für Neulinge zusätzlich erschwerend ist, dass die Nummer meist im Sedezimalsystem angegeben wird, beim Eurozeichen also 20AC1. Für Uniccode-Codepoints hat sich die Notation U+20AC mit genau vier Sedezimalziern eingebürgert. In HTML haben Sie vielleicht schon die sedezimale und die dezimale Schreibweise € und € gesehen. In vielen Programmiersprachen benutzt man die Notation \uxxxx. Texte werden durch die Codepoints ihrer Schriftzeichen dargestellt. Ein Text besteht also aus einer Folge von Codepoints aus einem Zeichencode. Wenn Ihr neuer Rechner 719,16e gekostet hat und dieser Preis im Unicode gespeichert wird, besteht er aus den Codepoints 55 49 57 44 49 54 8364 oder im Sedezimalsystem 37 31 39 2C 31 36 20AC. Notationen dieser Folge sind dann U+0037 U+0031 U+0039 U+002C U+0031 U+0036 U+20AC oder auch \u0037 \u0031 \u0039 \u002C \u0031 \u0036 \u20AC. In einfachen Fällen können die Codepoints wie im Beispiel direkt aneinandergereiht werden. Werden sie als Text angegeben, müssen sie durch ein Zeichen getrennt werden. Im Beispiel wurde das Leerzeichen verwendet. Im Rechnerspeicher benutzt man Bytes mit Werten zwischen 0 und 255 für ASCII-Texte (UCS-1), Doppelbytes mit Werten zwischen 0 und 65535 (UCS-2) oder Vierbytegruppen mit Werten zwischen 0 0 und 4294967295 (UCS- 4) für Unicodetexte. Zusätzlich muss bei Bytegruppen mit mehr als einem Byte die sog. endianess festgelegt werden. Als UCS-2-Text müssen im Beispiel die zu kurzen Zahlen mit Nullen auf 2 Byte aufgefüllt werden: 0037 0031 0039 002C 0031 0036 20AC. Wenn man dieses Beispiel in Einzelbytes auöst erhält man 00 37 00 31 00 39 00 2C 00 31 00 36 20 AC in der bigendian-Darstellung und 37 00 31 00 39 00 2C 00 31 00 36 00 AC 20 in der littleendian-Darstellung. Dieser Parameter wird von der verwendeten Hardware bestimmt; Intel und ARM speichern littleendian, Risc-Cpus (Sparc, Power, Mips), 68000, Alpha oder MMIX speichern bigendian. Die genaue Festlegung, wie Codepoints abgespeichert werden, wird encoding genannt. Heute wird UCS selten verwendet, da die encodings UCS-1, UCS-2, UCS-4 mit der endianess als Zusatzangabe als veraltet gelten. Die Verfahren, Codepoints mit mehr als 8 Bit zu speichern, sind also deutlich komplexer geworden. Das encoding ist die Festlegung des konkret verwendeten Ablageverfahrens. Die encoding form (gute deutsche Übersetzung nicht bekannt, cef, character encoding form, oft nur kurz encoding genannt) deniert, in wie groÿe Bytegruppen ein Codepoint gespeichert wird und wie Codepoints, die die denierte Bytegruppe überschreiten, gespeichert werden können. Im UTF-8 werden Einzelbytes verwendet, UTF-16 speichert Codepoints in ein oder zwei 16-Bit-Variablen und UTF-32 kann alle heutigen Codepoints in einer 32-Bit-Variablen speichern. Die Variablen heiÿen auch code units. Weil der Begri so wichtig ist: Eine code unit ist eine Speichereinheit für einen ganzen Codepoint oder, falls die code unit zu klein ist, für einen Codepoint-Teil. Dann besteht der Codepoint aus mehreren code units. Das encoding scheme (gute deutsche Übersetzung nicht bekannt, ces, character encoding scheme, oft nur kurz endianess genannt) deniert die Ablage der Variablen als Bytes im Speicher. In einfachen Fällen wird nur die Reihenfolge festgelegt (big-endian oder little-endian), jedoch sind auch platzsparende schemes de- niert (SCSU, BOCU, Puniycode). Komplexe Schemes können zwischen mehreren Varianten wechseln (ISO/IEC 1Das Sedezimalsystem, auch Hexadezimalsystem benutzt die ersten sechs Buchstaben A, B, C, D, E und F als Ziern mit den Werten A=10, B=11, C=12, D=13, E=14 und F=15.