Die Darstellung von Unicode-Zeichen in Python ist teilweise nicht ganz einfach nachvollziehbare Thematik. Diese Präsentation gibt Hilfstellungen, um den berüchtigten UnicodeError zu vermeiden. Behandelte Themen sind die Wahl eines Encodings, der richtige Zeitpunkt zum en- und decoden sowie die Erkennung eines verwendeten Encodings ohne entsprechende Dokumentation.
“Eine CPU kann rechnen, aber ein DSP kann zaubern”hybr1s
Nach einer kurzen Einführung in die Signalverarbeitung werden DSP-spezifische Eigenschaften und Möglichkeiten am Beispiel des VS1063 Audiocodecs dargestellt.
Dirty Little Snippets - SEO Campixx 2014 - Slides zum VortragMySEOSolution
Verschiedene Tipps, Tricks und Hacks zur Snippet Optimierung in den Suchmaschinenergebnissen von Google. Nach einer kurzen Einführung in die Basics werden verschiedene Experimente - basierend auf Live-Test-Projekten- in den Bereichen Rich Snippets und Nutzung von Unicode- Zeichen vorgestellt. Kurze Zusammenfassung der Ergebnissen:
- Rich Snippets lassen sich nicht mehr (einfach) manipulieren [ http://unicode.myseosolution.de/rich-snippets ] und eine Manipulation kann zu einer Meldung in den Google Webmaster Tools führen.
- Unicode-Zeichen werden bisher nur von wenigen Webseiten gezielt eingesetzt, können aber durch Piktogramme und Call-To-Action-Symbole sehr sinnvoll sein. Leider ist die Darstellung von viele Faktoren abhängig (Betriebssystem, Browser, etc.) und Google lässt nur bestimmte Zeichen zu [ http://unicode.myseosolution.de/ & http://bit.ly/PLeSlf ].
Letztendlich gilt: Die in dieser Session vermittelten Möglichkeiten müssen unbedingt vor dem praktischen Einsatz getestet werden und es gibt keine Garantien, dass Google die Darstellung auch in Zukunft so bei beibehält.
“Eine CPU kann rechnen, aber ein DSP kann zaubern”hybr1s
Nach einer kurzen Einführung in die Signalverarbeitung werden DSP-spezifische Eigenschaften und Möglichkeiten am Beispiel des VS1063 Audiocodecs dargestellt.
Dirty Little Snippets - SEO Campixx 2014 - Slides zum VortragMySEOSolution
Verschiedene Tipps, Tricks und Hacks zur Snippet Optimierung in den Suchmaschinenergebnissen von Google. Nach einer kurzen Einführung in die Basics werden verschiedene Experimente - basierend auf Live-Test-Projekten- in den Bereichen Rich Snippets und Nutzung von Unicode- Zeichen vorgestellt. Kurze Zusammenfassung der Ergebnissen:
- Rich Snippets lassen sich nicht mehr (einfach) manipulieren [ http://unicode.myseosolution.de/rich-snippets ] und eine Manipulation kann zu einer Meldung in den Google Webmaster Tools führen.
- Unicode-Zeichen werden bisher nur von wenigen Webseiten gezielt eingesetzt, können aber durch Piktogramme und Call-To-Action-Symbole sehr sinnvoll sein. Leider ist die Darstellung von viele Faktoren abhängig (Betriebssystem, Browser, etc.) und Google lässt nur bestimmte Zeichen zu [ http://unicode.myseosolution.de/ & http://bit.ly/PLeSlf ].
Letztendlich gilt: Die in dieser Session vermittelten Möglichkeiten müssen unbedingt vor dem praktischen Einsatz getestet werden und es gibt keine Garantien, dass Google die Darstellung auch in Zukunft so bei beibehält.
Wie oft haben Sie schon in Foren gelesen: "Das geht nicht mit Bordmitteln; das muss man mit der C API machen". Schön und gut, aber wie geht das? Welche Tools benötige ich, und wo bekomme ich diese her? Die Session gibt einen Überblick über die Anwendungsgebiete der C / C++ API für Lotus Notes / Domino und erläutert die Installation einer Entwicklungsumgebung. Neben der Erstellung von C Programmen wird auch der direkte Aufruf von Funktionen aus Lotusscript heraus erläutert.
Praktische Beispiele sollen dem Entwickler den Einstieg in die Programmierung mit der C / C++ API für Lotus Notes / Domino erleichtern. Level: Einsteiger, die sich auch in Zeiten von XPages, JAVA und SSJS noch an das "Urgestein C" herantrauen.
QAtalk, Dezember 2019, QAware München: Vortrag von Harald Störrle (@stoerrle, Senior IT-Berater bei QAware)
=== Dokument bitte herunterladen, falls unscharf! ===
Im logisch-relationalen Programmierparadigma werden Programme nicht als Befehlsfolgen oder geschachtelte Funktionen ausgedrückt, sondern als Menge von logischen Schlussregeln. Der paradigmatische Vertreter des logisch-deklarativen Programmierstils ist PROLOG. Diese Sprache ist aus drei Gründen interessant.
• Zum einen ist das logisch-relationale Programmierparadigma fundamental anders und sehr eigen, was zur Reflektion über die persönlichen Programmiergewohnheiten anregt.
• Außerdem taucht der Stil seit Jahrzehnten immer wieder unvermutet an den verschiedensten Stellen auf, daher sollte jeder Programmierer (und jede Programmiererin) diesen Stil zumindest kennen, besser noch: beherrschen.
• Zum anderen bietet die Programmiersprache PROLOG einige überraschende und ungewöhnliche Features, die sie zur stilbildenden KI-Programmiersprache gemacht haben (neben Lisp, und neuerdings Python).
Daher soll es heute eine kleine Einführung in die Programmierpraxis mit PROLOG geben.
This presentation covers the state of the syslog protocol and its standardization as of 2005. It was created for and held at Linuxtag in Germany (and as such is in German).
Expanding skill sets - Broaden your perspective on designroskakori
The term design can mean different things to people from different backgrounds. This talk from the PyGRAZ and UX Graz meetup from 2023-07-25 acts as basis for an open discussion between these two user groups. It describes the "minimum viable everything" design of an actual application under development. Starting from the problem to solve it explores the evolution of the data models and visualizes a major rework. It also showcases a few approaches to "low effort" UI in the early phase of a project when concepts are still in flux.
Die Kombination von Django als Backend und Flutter als mobile App oder Frontend ermöglicht die Entwicklung von Anwendungen in kurzer Zeit mit gut wartbarem Quellcode. Dieser Vortrag von der enterPy 22 Konferenz zeigt an Hand einer Beispielanwendung, wie das geht.
Multiple django applications on a single server with nginxroskakori
This talk explains how to install and setup multiple Django applications on a single server.
The general principle is to setup a systend service for each application that runs in nginx and gunicorn on Ubunto 20 LTS. This results in a lightweight installation that requires only a few and small configuration files that is well integrated in the existing tool chain around systemd.
Helpful pre commit hooks for Python and Djangoroskakori
Pre-commit hooks can help to keep your source code consistent and discover broken code before it makes it into the repository. This lightning talk describes pre-commit hooks that can be helpful when developing with Python, especially when using the Django framework. It also provides consistent example configurations for hooks that have conflicting defaults.
While the Python logging module makes it simple to add flexible logging to your application, wording log messages and choosing the appropriate level to maximize their helpfulness is a topic hardly covered in the documentation. This talk give guidelines on when to choose a certain log level, what information to include and which wording templates to use.
While the technical aspects of using Java logging frameworks are well described in the respective documentation and various blogs, less thought is given on how to actually word log messages, which information to include/exclude and in which situations to apply certain log levels. In this talk we are going to take a closer look at these topics in order to make your software easier to debug and support.
Einführung in Kommunikation und Konfliktmanagement für Software-Entwicklerroskakori
Die Einführung gibt Anregungen, wie Software-Entwickler strukturiert auch in emotionalen Situationen mit underterministischen Zielen effizient zu sachlichen Lösungsansätzen kommen können.
Weitere ähnliche Inhalte
Ähnlich wie Erste-Hilfekasten für Unicode mit Python
Wie oft haben Sie schon in Foren gelesen: "Das geht nicht mit Bordmitteln; das muss man mit der C API machen". Schön und gut, aber wie geht das? Welche Tools benötige ich, und wo bekomme ich diese her? Die Session gibt einen Überblick über die Anwendungsgebiete der C / C++ API für Lotus Notes / Domino und erläutert die Installation einer Entwicklungsumgebung. Neben der Erstellung von C Programmen wird auch der direkte Aufruf von Funktionen aus Lotusscript heraus erläutert.
Praktische Beispiele sollen dem Entwickler den Einstieg in die Programmierung mit der C / C++ API für Lotus Notes / Domino erleichtern. Level: Einsteiger, die sich auch in Zeiten von XPages, JAVA und SSJS noch an das "Urgestein C" herantrauen.
QAtalk, Dezember 2019, QAware München: Vortrag von Harald Störrle (@stoerrle, Senior IT-Berater bei QAware)
=== Dokument bitte herunterladen, falls unscharf! ===
Im logisch-relationalen Programmierparadigma werden Programme nicht als Befehlsfolgen oder geschachtelte Funktionen ausgedrückt, sondern als Menge von logischen Schlussregeln. Der paradigmatische Vertreter des logisch-deklarativen Programmierstils ist PROLOG. Diese Sprache ist aus drei Gründen interessant.
• Zum einen ist das logisch-relationale Programmierparadigma fundamental anders und sehr eigen, was zur Reflektion über die persönlichen Programmiergewohnheiten anregt.
• Außerdem taucht der Stil seit Jahrzehnten immer wieder unvermutet an den verschiedensten Stellen auf, daher sollte jeder Programmierer (und jede Programmiererin) diesen Stil zumindest kennen, besser noch: beherrschen.
• Zum anderen bietet die Programmiersprache PROLOG einige überraschende und ungewöhnliche Features, die sie zur stilbildenden KI-Programmiersprache gemacht haben (neben Lisp, und neuerdings Python).
Daher soll es heute eine kleine Einführung in die Programmierpraxis mit PROLOG geben.
This presentation covers the state of the syslog protocol and its standardization as of 2005. It was created for and held at Linuxtag in Germany (and as such is in German).
Expanding skill sets - Broaden your perspective on designroskakori
The term design can mean different things to people from different backgrounds. This talk from the PyGRAZ and UX Graz meetup from 2023-07-25 acts as basis for an open discussion between these two user groups. It describes the "minimum viable everything" design of an actual application under development. Starting from the problem to solve it explores the evolution of the data models and visualizes a major rework. It also showcases a few approaches to "low effort" UI in the early phase of a project when concepts are still in flux.
Die Kombination von Django als Backend und Flutter als mobile App oder Frontend ermöglicht die Entwicklung von Anwendungen in kurzer Zeit mit gut wartbarem Quellcode. Dieser Vortrag von der enterPy 22 Konferenz zeigt an Hand einer Beispielanwendung, wie das geht.
Multiple django applications on a single server with nginxroskakori
This talk explains how to install and setup multiple Django applications on a single server.
The general principle is to setup a systend service for each application that runs in nginx and gunicorn on Ubunto 20 LTS. This results in a lightweight installation that requires only a few and small configuration files that is well integrated in the existing tool chain around systemd.
Helpful pre commit hooks for Python and Djangoroskakori
Pre-commit hooks can help to keep your source code consistent and discover broken code before it makes it into the repository. This lightning talk describes pre-commit hooks that can be helpful when developing with Python, especially when using the Django framework. It also provides consistent example configurations for hooks that have conflicting defaults.
While the Python logging module makes it simple to add flexible logging to your application, wording log messages and choosing the appropriate level to maximize their helpfulness is a topic hardly covered in the documentation. This talk give guidelines on when to choose a certain log level, what information to include and which wording templates to use.
While the technical aspects of using Java logging frameworks are well described in the respective documentation and various blogs, less thought is given on how to actually word log messages, which information to include/exclude and in which situations to apply certain log levels. In this talk we are going to take a closer look at these topics in order to make your software easier to debug and support.
Einführung in Kommunikation und Konfliktmanagement für Software-Entwicklerroskakori
Die Einführung gibt Anregungen, wie Software-Entwickler strukturiert auch in emotionalen Situationen mit underterministischen Zielen effizient zu sachlichen Lösungsansätzen kommen können.
Analyzing natural language feedback using pythonroskakori
This talk outlines how to analyze natural language feedback from restauranteering using Python. It is accompanied by a Jupyter notebook that shows how to use spaCy to split long texts into sentences and token, access the lemma of a token. Next a lexicon is used to match the tokens and assign a topic and rating to each sentence.While the presented algorithm is quite simple to implement and understand it can resolve that constructs like "not very tasty" represent a sentiment of "somewhat bad" despite the positive word "tasty".
Microsoft SQL Server with Linux and Dockerroskakori
This slightly tongue in cheek lightning talk shows how to get started with Microsoft SQL server on Linux in Docker.It explains installation, startup, data base creation on a local volume and how to connect using ODBC or JDBC.
This talk describes the design decisions, implementation steps and collected experiences related to migrating data oriented financial applications from Python 2.6 to Python 3.5 in the Raiffeisen Rechenzentrum.
Pygments is a Python package to syntax hightlight over 300 programming languages and text formats. This talk gives an overview on using the pygmentize tool to render source code as HTML, RTF or latex. It then explains the basics of lexers and tokens and show how to use the pygments API to implement source code converters. Finally a step by step life coding section describes how to implement your own lexer step by step.
Python is a great tool to implement simple trader bots based on HTTP and JSON. This talk gives an overview on the communication between bot and the exchange platform, what a basic bot loop can look like and how to test it using a scenario mock up.
Python offers several tool and public services that simplify starting and maintaining an open source project. This presentation show cases some of the most helpful one and explains the process, beginning with an empty folder and finishing with a published PyPI package.
Ant ist ein Build-Werkzeug aus der Java-Welt, das auch für Python Projekte verwendbar ist. Diese Präsentation zeigt Beispiele für häufige Aufgaben und beschreibt, wie eine Einbindung in Jenkins zur continuous integration erfolgeb kann.
Kanban zur Abwicklung von Reporting-Anforderungenroskakori
Aufträge zu Auswertungen im Bankwesen stelle durch ihre eine hohe Anzahl möglicher Auftraggeber, eine breite Streuung in der Komplexität und Umsetzungszeit sowie das weit gestreute Technologie-Set eine Herausforderung dar. Kanban ist eine schlanke und flexible Abwicklung, die unterstützt, solche Aufträge produktiv und prompt zu erledigen, so dass sowohl der Kunde als auch der Bearbeiter zufrieden sind. Eine Präsentation erfolgte auf der 9. Anwenderkonferenz für Software Qualität und Test (ASQT) 2011.
3. Ziele
Die Teilnehmer können...
● ...Texte mit Umlauten in Python verarbeiten.
● ...ein geeignetes Encoding wählen.
● ...die Stärken und Schwächen der wichtigsten
Encodings zuordnen.
● ...UnicodeError vermeiden.
4. Nicht-Themen
● Verstehen der Encodings auf Bit-Ebene
→ Wikipedia
● Implementieren eigener Encodings
● Sicherheitsüberlegungen
● http://unicodesnowmanforyou.com/
● 'U0001f4a9'
5. Wozu Unicode?
● Zur Darstellung und Verarbeitung von Texten
● Deckt die meisten verwendeten Schriftzeichen ab
(dz. ca. 110.000 für ca. 100 Schriften)
● Weit verbreitet und unterstützt
(Python, XML, Java, .NET, etc)
● Erste publizierte Version: 1991
6. Unicode ist ein Mapping
● Computer verarbeiten nur Zahlen
● Für Anzeige: Umwandlung der Zahlen in
Buchstaben und andere Zeichen
Zeichen Dezimaler
Wert
Unicode
Code Point
A 65 U+0041
ü 252 U+00fc
€ 8364 U+20ac
樹 27193 U+6a39
13. Encodings
● Externe Darstellung von Zeichenketten
● Für Datenaustausch über Dateien,
Netzwerkverbindungen etc
● Viele gebräuchliche Encodings älter als Unicode
● Können teilweise nur Teile von Unicode darstellen
14. Encodings
● Interne Darstellung von Unicode-Zeichen i.d.R. als
32 Bit Integer (4 Byte)
● Encodings stellen Zeichenketten i.d.R. als Folge von
8 Bit Integers (1 Byte) dar
print('u20ac'.encode('utf-8')) # euro sign as UTF-8
b'xe2x82xac'
15. UTF-32 (UCS-4, ISO 10646)
● Ordnet jedem Unicode-Zeichen einen 32 Bit Integer
zu
● Per Definition zwischen 0 und 0x7fffffff (31 Bit)
● In der Praxis zwischen 0 und 0x0010ffff (21 bit)
● Jedes Zeichen benötigt genau 4 Byte
● Technisch „logischste“ Art der Darstellung
● Interne Darstellung vieler Programmiersprachen
16. UTF-32 (UCS-4, ISO 10646)
# This code works in Python 2.6+ and 3.3+.
import io
with io.open('menu.txt', 'w', encoding='utf-32') as menu_file:
menu_file.write(u'Spätzle: 10€')
$ hexdump -C menu.txt
00000000 ff fe 00 00 53 00 00 00 70 00 00 00 e4 00 00 00 |....S...p.......|
00000010 74 00 00 00 7a 00 00 00 6c 00 00 00 65 00 00 00 |t...z...l...e...|
00000020 3a 00 00 00 20 00 00 00 31 00 00 00 30 00 00 00 |:... ...1...0...|
00000030 ac 20 00 00 |. ..|
17. UTF-32 (UCS-4, ISO 10646)
# This code works in Python 2.6+ and 3.3+.
import io
with io.open('menu.txt', 'w', encoding='utf-32') as menu_file:
menu_file.write(u'Spätzle: 10€')
$ hexdump -C menu.txt
00000000 ff fe 00 00 53 00 00 00 70 00 00 00 e4 00 00 00 |....S...p.......|
00000010 74 00 00 00 7a 00 00 00 6c 00 00 00 65 00 00 00 |t...z...l...e...|
00000020 3a 00 00 00 20 00 00 00 31 00 00 00 30 00 00 00 |:... ...1...0...|
00000030 ac 20 00 00 |. ..|
18. UTF-32 (UCS-4, ISO 10646)
● Erfordert vergleichsweise viel
Speicherplatz
● Unterschiedliche Darstellung von 32
Bit Integer je nach CPU-Architektur
(„endianess“)
● Kann 0-Bytes enthalten
→ markiert Ende von Zeichenketten
in C
19. UTF-32 (UCS-4, ISO 10646)
# This code works in Python 2.6+ and 3.2+.
import io
with io.open('menu.txt', 'w', encoding='utf-32') as menu_file:
menu_file.write(u'Spätzle: 10€')
$ hexdump -C menu.txt
20. Byte Order Mark
● 0xfeff0000 = „big endian“ (ARM, Motorola)
● 0x0000fffe = „little endian“ (Intel)
● Wenn kein BOM:
– Offiziell: „big endian“ annehmen
– In der Praxis: viele Anwendungen nehmen „little
endian“ an, da dies Windows unter Intel entspricht
– Work around: nach Leerzeichen suchen:
0x20000000=big endian, 0x00000020=little endian
21. Byte Order Mark
● Vorsicht bei string.encode(): BOM wird bei jedem
Aufruf angehängt
>>> 'a'.encode('utf-32') + 'b'.encode('utf-32')
b'xffxfex00x00ax00x00x00xffxfex00x00bx00x00x00'
● Abhilfe: Endianess explizit angeben ('le', 'be'):
>>> 'a'.encode('utf-32') + 'b'.encode('utf-32le')
b'xffxfex00x00ax00x00x00bx00x00x00'
● Kein Problem bei io.open():nur erstes write() schreibt
BOM
22. UTF-16
● Teilt die 4 Byte aus UTF-32 auf in 2 mal 2 Byte
● Nur dann 4 Byte, wenn Code > 0xffff
● „Magic“ zwischen 0xd800 und 0xdfff
23. UTF-16
00000000 ff fe 53 00 70 00 e4 00 74 00 7a 00 6c 00 65 00 |..S.p...t.z.l.e.|
00000010 3a 00 20 00 31 00 30 00 ac 20 |:. .1.0.. |
● Hat BOM
● Kann 0-Bytes enthalten
● Vorteil: für westliche Encodings 50% weniger
Platzbedarf als UTF-32
● Länge einer Zeichenkette nur mit Dekodieren
ermittelbar
24. UCS-2
● Ähnlich UTF-16 aber nur für 0 bis 0xffff (16 Bit)
● „Jugendsünde“ von Unicode, als Chinesisch noch
als irrelevant betrachtet wurde
● Nicht verwenden um Daten
zu schreiben oder senden
● Weit verbreitet bei
Anwendungen, die früh
begannen, Unicode zu
unterstützen.
25. UTF-8
● Wandelt Zeichen um in 1 bis 4 Bytes
● Codes 0 bis 0x7f entsprechen den ASCII-Zeichen
● Codes 0x80 bis 0xff bedeuten, dass mehrere Bytes
zu verbinden sind, um das eigentliche Zeichen zu
erhalten
● „Zusammenbauen“ des eigentlichen Zeichencodes
über Bit-Operationen
https://en.wikipedia.org/wiki/Utf-8
26. UTF-8
● Kann 0-Bytes enthalten: 0 bleibt 0.
● Variante: Modified UTF-8 (MUTF-8): wandelt 0 um
in 0xc0 0x80 → für C verwendbar
● Speicherbedarf:
– Für englische Texte: 75% geringer als UTF-32
– Für deutsche Texte: ca. 70% geringer als UTF-32
27. UTF-8
● Kein BOM erforderlich, da sowohl auf big als auch
little endian das Ergebnis gleich ist
● Aber: BOM 0xefbbbf wird in der Praxis häufig
verwendet, um UTF-8 als solchen erkennbar zu
machen
● Microsoft Anwendungen ergänzen (Notepad) oder
erwarten (Compiler) BOM für UTF-8 Texte
28. UTF-8
● Sehr populär, verwendet für
– Python 3 Quellcodes (sofern nicht anders angegeben)
– XML (sofern nicht anders angegeben)
– Java String Serialization (MUTF-8)
● Verarbeitbar für Software, die eigentlich keinen
Unicode unterstützt (zB Lua-Strings)
● Windows Codepage: 65001
● Für ASCII-Texte ident
31. 8 Bit Encodings
● Aus der Zeit vor Unicode
● Effizient:
– Immer 1 Byte pro Zeichen
– Ermittlung der Länge O(1)
32. 8 Bit Encodings: Herausforderungen
● Umlaute, scharfes S: ä ö ü ß Ä Ö Ü
● Euro: €
33. ASCII
● „American Standard Code for
Information Interchange“
● Entstanden 1969
● Deckt die Anforderungen der
englischsprachigen Länder zur
Zeit der Mondlandung ab
https://de.wikipedia.org/wiki/Datei:Apollo11-Aldrin-Ausstieg.jpg
34. ASCII
● Buchstaben A-Z, Ziffern 0-9, Satzzeichen
● Einige Sonderzeichen wie , {, }, $ etc
● Steuerzeichen (0x00 bis 0x1f)
● Erfordert nur 7 Bit (Codes 0 bis 0x7f)
35. ASCII
● Keine Umlaute
● Kein Euro
● Für praktisch alle Anwendungsfälle unbrauchbar
● ASCII-Texte „immer verarbeitbar“
● Oft der Default wenn nicht anders angegeben
36. Latin-1 / ISO-8859-1
● Entstanden 1987
● Deckt die Anforderung vieler
westeuropäischen Länder ab als
„Never gonna give you up“
Nummer 1 war
● Default Encoding für:
– HTML
– Python Quellcodes bis 2.4
https://de.wikipedia.org/wiki/Datei:Rick_Astley-cropped.jpg
38. Latin-1 / ISO-8859-1
● 0x00 bis 0x7ff ident mit ASCII
● 0x80 bis 0x9f: unbenutzt - 7 Bit Terminals würden
diese Zeichen in 0x00 bis 0x1f umwandeln →
Steuerzeichen→ Chaos
● 0xa0 bis 0xff: diverse regionale Sonderzeichen
● Umlaute
● Kein Euro
39. Latin-9 / ISO-8859-15
● Entstanden 1999, gleichzeitig mit Counter
Strike und der Euro-Einführung
● Weitgehend ident mit Latin-1
● Einige Zeichen umdefiniert, insbesondere:
Euro = 0xa4
https://en.wikipedia.org/wiki/File:Counter-Strike_screenshot.png
41. Latin-9 / ISO-8859-15
● 0x08 bis 0x9f weiterhin unbenutzt (wegen 7 Bit
Terminals)
● „nicht ganz“ kompatibel mit Latin-1
42. CP1252 / Windows-1252
● Alle Zeichen von Latin-1 mit selbem
Code
● Alle zusätzlichen Zeichen von Latin-9
mit anderem Code
● Einige weitere Zeichen, insbesondere
„smart quotes“
● Oft als „Windows ANSI“ bezeichnet (ist
aber von Microsoft und nicht vom
American National Standard Institute)
https://de.wikipedia.org/wiki/Datei:Vorfenster_additional_window_fenetre_pour_l_hiver.JPG
44. CP1252 / Windows-1252
● Umlaute
● Euro = 0x80
● Kann bei Anzeige auf 7 Bit Terminals zu
Steuerzeichen führen
● Best practice: Wenn Dokument selbst sagt, dass es
Latin-1 ist, dann CP1252 annehmen
(zB W3C Recommendation in HTML5)
45. Zusammenfassung 8 Bit Encodings
Encoding Umlaute? Euro?
ASCII Nein Nein
Latin-1 Ja Nein
Latin-9 Ja Ja, bei 0xa4
CP1252 Ja Ja, bei 0x80
46. Empfehlungen für deutsche Texte
● Vorzugsweise UTF-8 verwenden
● Wenn 8 Bit Encoding erforderlich, vorzugsweise
CP1252; falls nicht vorhanden, dann Latin-1
● 8 Bit Encodings nur verwenden wenn:
– Anwendung / Protokoll / System Unicode noch nicht
unterstützt
– Migration unwirtschaftlich ist
– Speichereffizient kritisch ist
48. EBCDIC
● „Extended Binary Coded Decimal Interchange
Code“
● Entstanden um 1963
● Verwendet auf Großrechner
● Nicht verwenden außer externe Daten erfordern es.
49. CP500
● Zeichen für englische Texte (und einige
Sonderzeichen)
● Bedingt Vergleichbar mit ASCII
● Encoding für Dateisystem. Gültige Zeichen in
Namen: a-z, 0-9, $, @, TODO; Trennzeichen „.“, „(“
und „)“.
52. CP1141
● Ähnlich CP273 aber mit Euro-Zeichen
● Bedingt vergleichbar mit ISO-8859-15 und CP1252
53. Empfehlungen für EBCDIC
● Wenn möglich: EBCDIC nicht verwenden
● Für Quelldaten: CP1141
● Für Zieldaten: CP1252
● Für Dateinamen: CP500 (Systemvorgabe)
55. Wann en- und decoden
● Beim Einlesen Text decoden
● Programmintern immer alle Texte als Unicode
● Bei Ausgabe Text encoden
Python-
Programm
Unicode
Eingabe-
Bytes
Ausgabe-
Bytes
Decode Encode
56. Ein- und Ausgabe für Text
● io.open(path, mode, encoding=...)
# mode='r' oder 'w'
● csv.reader(file, ...) # Nutzt Encoding von file
csv.writer(file, ...)
● xml.etree.ElementTree.parse(path)
xml.etree.ElementTree.write(
path, encoding=..., xml_declaration=True)
● io.StringIO # ließt / schreibt Unicode String
57. Ein- und Ausgabe für Byte-Daten
● io.open(path, mode) # mode='rb' oder 'wb'
● io.BytesIO # ließt/schreibt Bytes
● Kompatibilität: io-Modul ist verfügbar seit Python
2.6+
59. Python Default Encoding
● Unterschiedliches Ergebnis je nach Python Version,
Betriebssystem, Mondphase und Tagesverfassung
● Empfehlung: ignorieren und immer explizites
Encoding nutzen
$ python2.6 -c "import sys; print(sys.getdefaultencoding())"
ascii
$ python3.4 -c "import sys; print(sys.getdefaultencoding())"
utf-8
60. Encoding für Terminal / Console
● Ähnlich hoffnungslos wie sys.getdefaultencoding()
● Unter Unix / Mac OS X:
$ export LC_ALL=en_US.UTF-8
● Unter Windows und cmd.exe:
chcp und UTF-8 Hacks wie beschrieben in
http://stackoverflow.com/questions/878972/
● Print() i.d.R. ok aber nicht notwendigerweise logging-Modul auf
sys.stderr, Ein-/Ausgabe mit sys.std*, Pipes, ...
● Unter Python 2 deterministisch praktisch immer kaputt,
unter Python 3 je nach Version.
63. Beispieldaten analysieren
● Grundstrategie für deutsche Texte
● Auf BOM prüfen: wenn vorhanden, dann je nach
Ausprägung UTF-32, UTF-16 oder UTF-8
● Als Hexdump anzeigen und auf Umlaut-ü und Euro-
Zeichen prüfen
71. UnicodeEncodeError
>>> 'Spätzle: 10€'.encode('ascii')
Traceback (most recent call last):
File "examples.py", line 78, in <module>
'Spätzle: 10€'.encode('ascii')
UnicodeEncodeError: 'ascii' codec can't encode character 'xe4' in
position 2: ordinal not in range(128)
72. UnicodeDecodeError
>>> spaetzle_bytes = 'Spätzle: 10€'.encode('cp1252')
>>> print(spaetzle_bytes)
b'Spxe4tzle: 10x80'
>>> spaetzle_bytes.decode('utf-8')
Traceback (most recent call last):
File "/Users/agi/workspace/talks/pygraz/unicode/examples.py",
line 85, in <module>
spaetzle_bytes.decode('utf-8')
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xe4 in
position 2: invalid continuation byte
74. Was tun bei UnicodeError?
● Jammern
● Weinen
● Brüllen
● Dinge durch den
Raum werfen
● Schoklade essen
● Etc etc etc
75. UnicodeError vermeiden
● Empfehlungen von vorhin folgen
● Früh decoden
● Intern nur Unicode
● Spät encoden
● Explizites Encoding
angeben
J. Robinson, Bomb Queen WMD – Woman of mass destruction, p. 7
76. Was tun wenn doch UnicodeError?
● Daten vor (De-)Kodieren im Rohformat ausgeben:
print('%r' % data)
● errors='replace' setzen und das Ergebnis analysieren
● encodings.cp1252 „verbessern“, so dass jedes Byte
(de-)kodierbar ist und das Ergebnis analysieren.
● Alles Workarounds um Fehler zu
finden → nach Lösungsfindung
wieder abbauen und sauber
umsetzen
77. CP1252 „verbessern“
● Nicht alle Bytes sind mapbar
● Einige mappen auf „undefined“ → UnicodeError
decoding_table = (
'x00' # 0x00 -> NULL
'x01' # 0x01 -> START OF HEADING
'x02' # 0x02 -> START OF TEXT
...
'}' # 0x7D -> RIGHT CURLY BRACKET
'~' # 0x7E -> TILDE
'x7f' # 0x7F -> DELETE
'u20ac' # 0x80 -> EURO SIGN
'ufffe' # 0x81 -> UNDEFINED
'u201a' # 0x82 -> SINGLE LOW-9 QUOTATION MARK
'u0192' # 0x83 -> LATIN SMALL LETTER F WITH HOOK
'u201e' # 0x84 -> DOUBLE LOW-9 QUOTATION MARK
…
)
78. CP1255 „verbessern“
import codecs
from encodings import cp1252
decoding_table = ''.join([
code if code != 'ufffe' else chr(index)
for index, code in enumerate(cp1252.decoding_table)
])
assert 'ufffe' not in decoding_table
cp1252.decoding_table = decoding_table
cp1252.encoding_table = codecs.charmap_build(decoding_table)
# Führt normalerweise zu UnicodeEncodeError.
print('x81'.encode('cp1252'))
80. Relevanz von Normalisierung
● In vielen Fällen keine Relevanz, insbesondere:
– Daten kommen alle aus dem selben System (zB eine
zentrale Datenbank)
– Daten werden nur angezeigt oder ausgewertet
● Vor allem dann ein Thema, wenn:
– Datenaustausch mit externen Systemen und
unterschiedlichen Plattformen
– Daten werden verglichen
82. Verschiedene Darstellungen
Verschiedene Darstellungen des selben Zeichen, zB Umlaut-ä:
● Ein Zeichen: U+00e4
● zusammengesetztes Zeichen: U+0061 U+0308
('a' + zwei Punkte darüber)
print_hexdump([code for code in
unicodedata.normalize('NFC', 'ä').encode('utf-16be')])
00000000: 00 e4 |..|
print_hexdump([code for code in
unicodedata.normalize('NFD', 'ä').encode('utf-16be')])
00000000: 00 61 03 08 |.a..|
83. Normalisierung in Filesystem
Keine Einheitlichkeit: Beispiel:
with io.open('u0049.tmp', 'wb'):
pass
with io.open('u2160.tmp', 'wb'):
pass
Ergebnis mit Mac OS Extended Filesystem:
$ ls -1 *.tmp
I.tmp
Ⅰ.tmp
84. Vergleichen mit Normalisierung
● NFC - wenn inhaltlich gleiche Zeichen gleich sein sollen
● NFKC - wenn auch optisch gleiche Zeichen gleich sein sollen
(Sicherheitsthema)
● NFD, NFKD – gleiches Ergebnis, aber erfordert unter Umständen
mehr Speicher
from unicodedata import normalize
print(normalize('NFC', 'u00e4') == normalize('NFC', 'u0061u0308'))
# True – umlaut ä
print(normalize('NFC', 'u0049') == normalize('NFC', 'u2160'))
# False – letter I and Roman number I
print(normalize('NFKC', 'u00e4') == normalize('NFKC', 'u0061u0308'))
# True – umlaut ä
print(normalize('NFKC', 'u0049') == normalize('NFKC', 'u2160'))
# True – letter I and Roman number I
85. Empfehlungen zu Normalisierung
● Erst dann zum Problem machen, wenn es eines ist.
● Wenn möglich durchgängig einheitlich
normalisieren (zB NFKC)
● Sonst je Eingangs-/Ausgangsystem beim
Lesen/Schreiben die erforderliche Normalisierung
nutzen
● Bei Dateinamen: abhängig vom Filesystem, für
Python nicht feststellbar (zB NFS).
89. Unicode in Python 2 und 3
● Ab 2.0: grundsätzlich unterstützt (u'text', codecs und
unicodedata Modul)
● Ab 2.5: __future__.unicode_literals Modul
● Ab 2.6: io Modul
● Ab 3.0: durchgängig aber teilweise inkompatibel zu
Python 2 unterstützt (kein u'text')
● Ab 3.3: wieder mit u'text'; verbesserte Erkennung
für Terminal-Encoding
90. Empfehlung
● Wenn möglich Python 3.3+ verwenden
● Sonst: wenn möglich Python 2.6+ verwenden
● Sonst: andere Programmiersprache mit guter
Unicode-Implementierung verwenden
(zB Java, C#, go, etc)
92. Zusammenfassung
● Python unterstützt Unicode je nach Version in
unterschiedlicher Qualität
● früh decoden, intern alles Unicode, spät encoden
● Encodings
– fix setzen, nicht auf Automatismen hoffen
– ggf. selbst herausfinden mit Hexdump, ü und €
– besonders nützlich: UTF-8, CP1252
● Python 2 Module für Unicode ähnlich Python 3:
io, unicode_literals