Думаю дело в том, что в UTF-8 наш алфавит не есть непрерывная последовательность. Более того, коды маленьких и больших букв не находятся в отношении codeof(x) = y + codeof(X):
vasya@albatros:~$ echo АБВГДЕЁЖЗИКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ | xxd
0000000: d090 d091 d092 d093 d094 d095 d081 d096 ................
0000010: d097 d098 d09a d09b d09c d09d d09e d09f ................
0000020: d0a0 d0a1 d0a2 d0a3 d0a4 d0a5 d0a6 d0a7 ................
0000030: d0a8 d0a9 d0aa d0ab d0ac d0ad d0ae d0af ................
0000040: 0a .
vasya@albatros:~$ echo абвгдеёжзиклмнопрстуфхцчшщъыьэюя | xxd
0000000: d0b0 d0b1 d0b2 d0b3 d0b4 d0b5 d191 d0b6 ................
0000010: d0b7 d0b8 d0ba d0bb d0bc d0bd d0be d0bf ................
0000020: d180 d181 d182 d183 d184 d185 d186 d187 ................
0000030: d188 d189 d18a d18b d18c d18d d18e d18f ................
0000040: 0a