Как проверить строку?

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Аватара пользователя
Сионист
Сообщения: 1211
Зарегистрирован: 31 мар 2014, 06:18

Есть строка std::u32string. Требуется проверить на одновременную истинность следующие утверждения:
1. Строка начинается и заканчивается символами, содержащими и фон, и хоть что то ещё, кроме фона.
2. Из остальных символов строка содержит только пробелы (те, что на клавише "пробел").
3. Ни какие два пробела не следуют подряд.
Если хотябы одно из трёх ложно, то надо получить false, иначе true.
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

А зачем столько тем плодить? Я удалил тему про символ, так как вопрос о символе включён сюда.

Насколько я понимаю, символ на отображаемость проверить нельзя никак, иначе, чем перечислив все коды неотображаемых символов. При этом, нет никакой гарантии, что когда-нибудь в будущем, в зарезервированной части уникод таблицы не появится какой-нибудь хитрый пробел или символ сдвига для какого-нибудь нового хитрого алфавита.

Предлагаю написать простейшую лобовую проверку и чекать только символы '\n', '\r', '\t', ' '. И в будущем, если понадобиться, расширить этот список.

Ещё раз подчёркиваю, что официального честного и максимального правильного решения (например специальной WIN API функции или чего-то подобного) не существует.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Аватара пользователя
Сионист
Сообщения: 1211
Зарегистрирован: 31 мар 2014, 06:18

Romeo писал(а):Предлагаю написать простейшую лобовую проверку и чекать только символы '\n', '\r', '\t'. И в будущем, если понадобиться, расширить этот список.
Эйси. Это полный текущий список? Какого нибудь длинного, или неразрывного пробела в UTF32 нет?
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Вроде не существует. Но я не уверен. Нужно гуглить.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Аватара пользователя
Сионист
Сообщения: 1211
Зарегистрирован: 31 мар 2014, 06:18

Сразу нашёл вот это:
. Не поможете разобраться?

В викепедии перечислены 16 разных пробелов. Не знаете, что там за коды приведены? UTF16? Или ещё какие?
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Аватара пользователя
WinMain
Сообщения: 929
Зарегистрирован: 14 янв 2005, 10:30
Откуда: Москва
Контактная информация:

Проверять посимвольно строку UTF-8 вообще не имеет смысла. Сначала её нужно сконвертировать в UTF-16 и потом уже сканировать.
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Да, WinMain прав - нужно перекодировать в UTF16.

И, судя по вики, пробельных символов действительно может быть много, так что придётся проверять с десяток значений. Хотя, если честно, я очень сомневаюсь, что твоя программа будет работать с такими экзотическими алфавитами.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Absurd
Сообщения: 1228
Зарегистрирован: 26 фев 2004, 13:24
Откуда: Pietari, Venäjä
Контактная информация:

Сначала её нужно сконвертировать в UTF-16 и потом уже сканировать.
UTF-16 тоже имеет чары переменной длины к сожалению. Лучше не заниматься велосипедостроением, а пользоваться библиотекой ICU от людей которые занимаются стандартизацией уникода. Там есть функция u_isspace.
2B OR NOT(2B) = FF
Аватара пользователя
Сионист
Сообщения: 1211
Зарегистрирован: 31 мар 2014, 06:18

WinMain писал(а):Проверять посимвольно строку UTF-8 вообще не имеет смысла. Сначала её нужно сконвертировать в UTF-16 и потом уже сканировать.
Вообще то она у меня в UTF32, этот код гарантированно равномерный. В отличие от. Зато и выбран.
Там есть функция u_isspace.
Что это за функция? И где про неё можно прочитать?
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Библиотека есть такая ICU.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Ответить