tr 'A-Z' 'a-z' handles ASCII. Beyond ASCII, case conversion stops being a simple character mapping.
The Turkish i
Turkish distinguishes dotted and dotless i. Lowercasing I gives ฤฑ under a Turkish locale and i everywhere else. Code that lowercases user input under the system locale before comparing it to a fixed string will fail on Turkish systems โ a classic, well-documented bug that survives because it never reproduces on the developer's machine.
Use invariant casing for comparison
For identifiers, protocol tokens and anything compared against a constant, use the invariant or ordinal form rather than the culture-sensitive one. Reserve locale-aware casing for text shown to users.
Not every conversion round-trips
German ร uppercases to SS, and lowercasing SS gives ss, not ร. Case conversion is not reversible, and it does not always preserve string length.
Case folding is the right operation
Where the goal is caseless comparison rather than display, full case folding is the defined operation for it. It handles these cases correctly where naive lowercasing does not.
Try it: Convert Text to Lowercase on SeoWolf's Notepad.