Я собрал здесь некоторые не очень очевидные факты о заглавных и строчных буквах, с которыми может столкнуться программист в работе. Многие из вас переводили строки во «все заглавные» (uppercase), «все строчные» (lowercase), «первую заглавную, а остальные строчные» (titlecase). Ещё более популярна операция сравнения без учёта регистра. В мировом масштабе такие операции могут быть весьма нетривиальны. Пост построен в виде «сборника заблуждений» с контрпримерами.
Нет. В тексте могут попасться строчные лигатуры, которым не соответствует один символ в верхнем регистре. Например, при переводе в uppercase: fi (U+FB00) -> FI (U+0046, U+0049)
Нет. Некоторым буквам с диакритикой нет точного соответствия в другом регистре, поэтому приходится использовать комбинированный символ. Скажем, в языке африкаанс есть буква ʼn (U+0149). В верхнем регистре ей соответствует комбинация из двух символов:
(U+02BC, U+004E). Если вам попадётся транслитерация арабского текста, вы можете столкнуться с
(U+1E96), которой в верхнем регистре также нет односимвольного соответствия, поэтому придётся заменять на
(U+0048, U+0331). В ваханском языке есть буква
(U+01F0) с аналогичной проблемой. Вы можете возразить, что это экзотика, однако на африкаанс в википедии 23000 статей.
Нет. Есть, например, в немецком языке буква «эсцет» ß (U+00DF). При переводе в верхний регистр, она превращается в два символа SS (U+0053, U+0053).
1. Если я переведу строку в uppercase или lowercase, число Unicode-символов не изменится.
Нет. В тексте могут попасться строчные лигатуры, которым не соответствует один символ в верхнем регистре. Например, при переводе в uppercase: fi (U+FB00) -> FI (U+0046, U+0049)
2. Лигатуры — изврат, ими никто не пользуется. Если их не учитывать, то я прав.
Нет. Некоторым буквам с диакритикой нет точного соответствия в другом регистре, поэтому приходится использовать комбинированный символ. Скажем, в языке африкаанс есть буква ʼn (U+0149). В верхнем регистре ей соответствует комбинация из двух символов:
![ʼN](https://habrastorage.org/storage2/a00/3b9/62f/a003b962f23b097f02f7c65557783f8f.png)
![](https://habrastorage.org/storage2/26f/f90/091/26ff900919322caa261f99fd15479e7a.png)
![](https://habrastorage.org/storage2/359/9f2/bad/3599f2bade4fb015a409d0df89c2b93d.png)
![](https://habrastorage.org/storage2/c06/df5/28b/c06df528b2e389afd8b9548a7b9ac9b7.png)
3. Ну хорошо, но давайте считать комбинированный символ (с участием modifying или combining code points) одним символом. Тогда длина всё же сохранится.
Нет. Есть, например, в немецком языке буква «эсцет» ß (U+00DF). При переводе в верхний регистр, она превращается в два символа SS (U+0053, U+0053).