Как проверить строку?
Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain
Есть строка std::u32string. Требуется проверить на одновременную истинность следующие утверждения:
1. Строка начинается и заканчивается символами, содержащими и фон, и хоть что то ещё, кроме фона.
2. Из остальных символов строка содержит только пробелы (те, что на клавише "пробел").
3. Ни какие два пробела не следуют подряд.
Если хотябы одно из трёх ложно, то надо получить false, иначе true.
1. Строка начинается и заканчивается символами, содержащими и фон, и хоть что то ещё, кроме фона.
2. Из остальных символов строка содержит только пробелы (те, что на клавише "пробел").
3. Ни какие два пробела не следуют подряд.
Если хотябы одно из трёх ложно, то надо получить false, иначе true.
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
- Romeo
- Сообщения: 3126
- Зарегистрирован: 02 мар 2004, 17:25
- Откуда: Крым, Севастополь
- Контактная информация:
А зачем столько тем плодить? Я удалил тему про символ, так как вопрос о символе включён сюда.
Насколько я понимаю, символ на отображаемость проверить нельзя никак, иначе, чем перечислив все коды неотображаемых символов. При этом, нет никакой гарантии, что когда-нибудь в будущем, в зарезервированной части уникод таблицы не появится какой-нибудь хитрый пробел или символ сдвига для какого-нибудь нового хитрого алфавита.
Предлагаю написать простейшую лобовую проверку и чекать только символы '\n', '\r', '\t', ' '. И в будущем, если понадобиться, расширить этот список.
Ещё раз подчёркиваю, что официального честного и максимального правильного решения (например специальной WIN API функции или чего-то подобного) не существует.
Насколько я понимаю, символ на отображаемость проверить нельзя никак, иначе, чем перечислив все коды неотображаемых символов. При этом, нет никакой гарантии, что когда-нибудь в будущем, в зарезервированной части уникод таблицы не появится какой-нибудь хитрый пробел или символ сдвига для какого-нибудь нового хитрого алфавита.
Предлагаю написать простейшую лобовую проверку и чекать только символы '\n', '\r', '\t', ' '. И в будущем, если понадобиться, расширить этот список.
Ещё раз подчёркиваю, что официального честного и максимального правильного решения (например специальной WIN API функции или чего-то подобного) не существует.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Эйси. Это полный текущий список? Какого нибудь длинного, или неразрывного пробела в UTF32 нет?Romeo писал(а):Предлагаю написать простейшую лобовую проверку и чекать только символы '\n', '\r', '\t'. И в будущем, если понадобиться, расширить этот список.
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
- Romeo
- Сообщения: 3126
- Зарегистрирован: 02 мар 2004, 17:25
- Откуда: Крым, Севастополь
- Контактная информация:
Вроде не существует. Но я не уверен. Нужно гуглить.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Сразу нашёл вот это:
В викепедии перечислены 16 разных пробелов. Не знаете, что там за коды приведены? UTF16? Или ещё какие?
. Не поможете разобраться?
В викепедии перечислены 16 разных пробелов. Не знаете, что там за коды приведены? UTF16? Или ещё какие?
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Проверять посимвольно строку 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" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
-
- Сообщения: 1228
- Зарегистрирован: 26 фев 2004, 13:24
- Откуда: Pietari, Venäjä
- Контактная информация:
UTF-16 тоже имеет чары переменной длины к сожалению. Лучше не заниматься велосипедостроением, а пользоваться библиотекой ICU от людей которые занимаются стандартизацией уникода. Там есть функция u_isspace.Сначала её нужно сконвертировать в UTF-16 и потом уже сканировать.
2B OR NOT(2B) = FF
Вообще то она у меня в UTF32, этот код гарантированно равномерный. В отличие от. Зато и выбран.WinMain писал(а):Проверять посимвольно строку UTF-8 вообще не имеет смысла. Сначала её нужно сконвертировать в UTF-16 и потом уже сканировать.
Что это за функция? И где про неё можно прочитать?Там есть функция u_isspace.
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
- Romeo
- Сообщения: 3126
- Зарегистрирован: 02 мар 2004, 17:25
- Откуда: Крым, Севастополь
- Контактная информация:
Библиотека есть такая ICU.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.