Как проверить первый символ переменной типа std::string на принадлежность к верхнему регистру с учетом правил русского языка?
Есть что-то готовое или как это сделать ручками?
Asked
Active
Viewed 2,797 times
5
Kromster
- 13,809
Darth Nyan
- 197
1 Answers
1
Можно сделать ручками на основе кодов символов
Для начала проверяем, лежит ли символ в диапазоне заглавных букв:
(letter >= 1040 && letter <= 1071) || letter == 1025
letter == 1025 — отдельная проверка для буквы Ё.
Если да, то ничего не делаем, а если нет, то проверяем буква ли это вообще (вдруг там число в начале строки).
letter => 1072 && letter <= 1103 // (пока без учёта буквы ё)
Напомню, что, когда к типу char применяются операции сравнения или арифметические операции, то работа идёт именно с кодом символа, а не с самим символом.
Итак, мы выяснили, что наш символ — это буква в нижнем регистре. Чтобы перевести её в upper case достаточно уменьшить её код на 32, что прекрасно видно из таблицы выше( код A — 1040, код a — 1072; 1072-1040 = 32).
char letter = 'a';
letter -= 32;
Теперь letter = 'A', что нам необходимо.
Осталось отдельно обработать случай с буквой ё, когда:
letter == 1105
Arhadthedev
- 11,528
AnnGabr
- 51
-
1Это unicode (т.е. имеет смысл для wchar_t), а у автора наверняка utf-8 (char[], для русских букв по 2 байта на символ) / (Ручками русские буковки в utf можно взять из https://pastebin.com/gg6Xe9KL и https://pastebin.com/iCC2k7RW) – avp Apr 18 '17 at 23:03
-
1@avp
wchar_tможет быть недостаточно, чтобы произвольную Unicode code point хранить (на Windows для UTF-16 code units этот тип используется). Unicode часто подводные камни имеет, лучше готовую библиотеку использовать (типа glib, ICU или другую в зависимости от требований проекта). – jfs Apr 19 '17 at 03:13 -
@jfs, справедливо, но неужели применение islower/isupper к суррогатным парам будет отличаться от их вызова с любой из половинок? =) – avp Apr 19 '17 at 21:31
-
1@avp конечно могут отличаются. Свойства не BMP символа никак не связаны со свойствами отдельных половинок, когда он в виде суррогатной пары представлен. К тому же не стоит отождествлять utf-16 code units и Unicode code point (это нарушение абстракции, как к примеру можно было наблюдать на узких сборках Python 2 или в JavaScript. Посмотрите на пример разницы между байтами, code unit для какой-либо кодировки, Unicode code point, grapheme clusters (символы воспринимаемые пользователем) для одного и того же текста) – jfs Apr 19 '17 at 22:44
-
@jfs, откровенно говоря, не понял. Время позднее, подумаю еще завтра. Пока же остаюсь при своем мнении и вот почему. Любая "половинка" суррогатной пары сама по себе invalid (ей ни какой unicode не соответствует). Соответственно, вызов isupper/islower для нее даст false. С другой стороны, этими парами (они valid) кодируются разные древние иероглифы и т.п. изображения, и поверить, что к ним всерьез можно применить понятия upper/lower я не могу, т.е. результат вызова тоже будет false. Такая вот цепочка рассуждений в обоснование краткого комментария. – avp Apr 19 '17 at 23:29
-
@avp: вы имеете право на своё мнение, но не на свои факты. Легко убедиться, что существуют астральные символы, у которых islower() или isupper() возвращает true – jfs Apr 20 '17 at 09:05
-
@jfs, вот это другое дело, убедили. / (замечательная штука, этот питон, надо будет все же освоить...) – avp Apr 20 '17 at 10:38
-
@avp: с Питоном можно за полдень ознакомиться: пройдите в REPL официальное вводное руководство (есть на русском и как книжка), чтобы узнать основы языка и стандартной библиотеки. Прочтите Code Like a Pythonista: Idiomatic Python, чтобы духом проникнуться. Попробуйте знакомые задачки, но реализуйте их, используя Питон как исполняемый псевдо-код или как клей, который связывает компоненты с помощью Awesome Python библиотек, к примеру, web crawler реализуйте. Будут вопросы, спрашивайте. – jfs Apr 25 '17 at 20:36
-
@jfs, спасибо (уже открыл вкладки по ссылкам). Вообще-то, я читал и Гвидо и Бизли (и язык мне симпатичен (только скобочек не хватает =)). А вот пописать на нем (а значит как следует запомнить множество уже готовых полезных штучек, использование которых как раз позволяет делать компактный код) как-то руки не доходят... – avp Apr 25 '17 at 21:44
-
@avp: если язык не экономит время в итоге (за счёт идей или непосредственного применения), то и учить его не стоит. Только читая, не программируя, выучить язык очень тяжело. Можно хоть как калькулятор Python REPL использовать. Чтобы код и текст вперемежку шли, для заметок удобно jupyter notebook использовать (пример воссоздания графика из знаменитого TED talk), тесты писать (даже для С кода, браузера (selenium)), devops, от микроконтроллеров до гигантских роботов, автоматизация https://automatetheboringstuff.com/ etc. – jfs Apr 27 '17 at 16:27
-
@jfs, ну, что без практики не выучить, это как говорится, и ежу понятно. А вот за наводку на http://micropython.org/ с bare metal огромное спасибо (не поверите, может скоро на новой работе и пригодится (тьфу-тьфу, чтобы не сглазить)) – avp Apr 27 '17 at 20:36

isupper(s[0])– Harry Mar 08 '17 at 10:26