Unicode / MD5

Unterschiedliche Encodings gehören zu den ekligsten und nervigsten Dingen unserer Tage und trotzdem muss man sich in regelmäßigen Abständen immer wieder mit ihnen auseinandersetzen. In Python (Version 2.X) wird man dabei zwar schon an vielen Stellen an die Hand genommen, eine absolut transparente Lösung gibt es aber erst ab Python 3.0. Wichtigste Änderung dort: Fortan verwendet Python nichtmehr ASCII als Standardencoding für Bytestrings, sondern UTF-8. Dadurch werden viele Problemchen und Stolperfallen hoffentlich bald endgültig der Vergangenheit angehören.

Aber bis dorthin muss man sich wahrscheinlich noch ein bisschen plagen, beispielsweise, wenn man das Modul "md5" in Python verwendet. Ihm sollte man tunlichst keine Unicode-Strings anbieten, weil diese für das Berechnen des Hashes in ASCII-encodierte Bytestrings umgewandelt werden. Das führt in den allermeisten Fällen zu Problemen, spätestens dann, wenn der Unicode-String Zeichen enthält, die in ASCII nicht vorgesehen sind.

Deshalb schreibt man statt

import md5
md5.md5(my_string).hexdigest()

lieber

import md5
md5.md5(my_string.encode('utf-8')).hexdigest()

Den Unterschied bemerkt man spätestens, wenn my_string Sonderzeichen enthält.

Tags: Python