|
Несколько глупых вопросов по std::string и std::wstring
|
|||
---|---|---|---|
#18+
Добрый день! Начал писать мини-проект: консольное приложение для Windows на C++. Для работы со строками выбрал std::string и std::wstring. Вроде себе ничего такие. Только у меня по ним парочка вопросов... Первое, в W-функциях WinAPI используется что именно - UTF-16 или UCS-2? А как/что хранит/поддерживает std::wstring? А в чём разница? Можно ли их как-то отличать в runtime по факту/содержимому (например хотя бы в отладчике)? Второе, я получил текст из W-функции WinAPI, засунул его в std::wstring, но оказалось что в этом тексте куча символов "\r" и "\n" - как бы их убрать попроще? Причём иногда мне надо их убирать полностью все, а иногда только если они в начале/конце. И ещё консоль как-то криво выводит строки, в которых разные сочетания "\r" и "\n" (с этим я пока не выявил зависимость). Приводить бы их как-то к единому заданному виду, что ли? Как-то можно? Третье, мне нужно сделать тексту внутри std::wstring (самому содержимому) нижний регистр. Нагуглил какой-то способ (std::transform + std::tolower), но он, нормально работая для латиницы, чё-то игнорирует кириллицу... И последнее - как правильно конвертировать std::string <~> std::wstring? Гугл предлагает либо MultiByteToWideChar и что-то аналогичное (но я как-то сильно не уверен в некоторых параметрах), либо пишет что как бы были какие-то методы в самом std:: но они типа упразднены, но вы можете воспользоваться всякими другими библиотеками. Мне бы хотелось обойтись без лишнего, вот подключил я уже std:: этот - он сам свои же типы не может что ли сконтачить? Только через дополнительных посредников и СМС? Спасибо! ... |
|||
:
Нравится:
Не нравится:
|
|||
10.11.2020, 14:52 |
|
Несколько глупых вопросов по std::string и std::wstring
|
|||
---|---|---|---|
#18+
ResourceSpace получил текст из W-функции WinAPI, засунул его в std::wstring, но оказалось что в этом тексте куча символов "\r" и "\n" - как бы их убрать попроще? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.11.2020, 15:41 |
|
Несколько глупых вопросов по std::string и std::wstring
|
|||
---|---|---|---|
#18+
ResourceSpace И ещё консоль как-то криво выводит строки, в которых разные сочетания "\r" и "\n" (с этим я пока не выявил зависимость) Это спецсимволы для управления курсором в консоли: "\r" - возврат курсора в начало текущей строки, если что-то было в строке, то новое будет писаться поверх старого "\n" - переход в начало следующей строки https://ru.wikipedia.org/wiki/Перевод_строки ... |
|||
:
Нравится:
Не нравится:
|
|||
10.11.2020, 15:49 |
|
Несколько глупых вопросов по std::string и std::wstring
|
|||
---|---|---|---|
#18+
ResourceSpace И ещё консоль как-то криво выводит строки, в которых разные сочетания "\r" и "\n" (с этим я пока не выявил зависимость). Приводить бы их как-то к единому заданному виду, что ли? Как-то можно? Исторически сложилось что переводы строк не стандартизированы. Это может быть Unix-перевод строки (1 символ \n) или DOS/Windows-вариант (\n\r). Поэтому обрабатыай все ситуации. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.11.2020, 16:05 |
|
Несколько глупых вопросов по std::string и std::wstring
|
|||
---|---|---|---|
#18+
Переводы строк мне хорошо известны. Вопрос был как раз как их обрабатывать , когда они в std::string или std::wstring. PetroNotC Sharp код дай Какой код? Внутри переменной типа std::wstring текст оканчивающийся на "\r\n\r\n\r\n" - как их убрать, допустим, только с конца? И как, если надо из всего текста? ResourceSpace И ещё консоль как-то криво выводит строки, в которых разные сочетания "\r" и "\n" (с этим я пока не выявил зависимость). Всё, выявил. При выводе в консоль нельзя чтоб в строке было одинокое "\r". Хотя тут можно было и так догадаться. :) Однако, оказалось что в идеале должно быть наоборот одинокое "\n". По крайней мере для mode используемом на данный момент. хм... ... |
|||
:
Нравится:
Не нравится:
|
|||
10.11.2020, 17:02 |
|
Несколько глупых вопросов по std::string и std::wstring
|
|||
---|---|---|---|
#18+
ResourceSpace Какой код? Внутри переменной типа std::wstring текст оканчивающийся на "\r\n\r\n\r\n" - как их убрать, допустим, только с конца? И как, если надо из всего текста? Не кипятись. Послушай старого модератора. В этом форуме иногда 1 строчка кода стоит целого абзаца поясняющего текста. Поэтому когда чел тебя просит - то будь добр, предоставь. Этож не сложно? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.11.2020, 17:29 |
|
Несколько глупых вопросов по std::string и std::wstring
|
|||
---|---|---|---|
#18+
ResourceSpaceВопрос был как раз /как их обрабатывать/, когда они в std::string или std::wstring. Обычно - никак, потому что в строках эти символы сами собой не появляются без (весьма значительных) усилий со стороны программиста. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
10.11.2020, 18:10 |
|
Несколько глупых вопросов по std::string и std::wstring
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov Обычно - никак Поиск подстроки, замена подстроки, конкатенация, в верхний регистр, в нижний регистр - не, ненада ничего? :) mayton Не кипятись. В функцию передан std::wstring, текст может быть какой угодно, он извне. Надо убрать из текста "\r\n" - в одном случае только в конце, в другом во всём тексте. mayton Этож не сложно? Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
Ожидаю: C:\Utils>myApp.exe line line line C:\Utils>А получается:C:\Utils>myApp.exe line line line C:\Utils>А по остальным пунктам пока глухо? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.11.2020, 19:41 |
|
Несколько глупых вопросов по std::string и std::wstring
|
|||
---|---|---|---|
#18+
ResourceSpace, ну вот твой кейс. Пока строчка еще std - надо из нее отрезать все "spacers" справа (rtrim()) и только потом в конце преобразовать в С-строку. https://stackoverflow.com/questions/25829143/trim-whitespace-from-a-string/25829178 ... |
|||
:
Нравится:
Не нравится:
|
|||
10.11.2020, 19:47 |
|
Несколько глупых вопросов по std::string и std::wstring
|
|||
---|---|---|---|
#18+
ResourceSpaceПоиск подстроки, замена подстроки, конкатенация, в верхний регистр, в нижний регистр - не, ненада ничего? :) Есть. Внезапно, но все эти методы описаны в документации: https://en.cppreference.com/w/cpp/string/basic_string/ Но вот чтобы в строке были '\r' или '\n' - верится с трудом. Пусть даже она и "приходит извне". Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
10.11.2020, 20:01 |
|
Несколько глупых вопросов по std::string и std::wstring
|
|||
---|---|---|---|
#18+
Библиотечные функции обычно например, убрать пробелы в конце или начале. У тебя Нетипичные спец символы. Вполне можешь в цикле посимвольно их убрать. И действительно разберись, почему тебе приходит на вход мусорная свалка. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.11.2020, 20:44 |
|
Несколько глупых вопросов по std::string и std::wstring
|
|||
---|---|---|---|
#18+
Попытаюсь пованговать: он вывод какого-то консольного приложения перехватывает и хочет анализировать, но не понимает как это сделать. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.11.2020, 20:49 |
|
Несколько глупых вопросов по std::string и std::wstring
|
|||
---|---|---|---|
#18+
Dima TПопытаюсь пованговатьь: он вывод какого-то консольного приложения перехватывает Не, это слишком сложно. Ставлю на то, что он эти классы использует как буфер. Типа: Код: sql 1.
Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
10.11.2020, 21:07 |
|
Несколько глупых вопросов по std::string и std::wstring
|
|||
---|---|---|---|
#18+
Dima T Попытаюсь пованговать: он вывод какого-то консольного приложения перехватывает и хочет анализировать, но не понимает как это сделать. Дык этож для Перл задачка! А где этот Прохоров-Милторг? Он щас тут быстро всё порешает одной регуляркой. Офигеете как это жутко красиво будет. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.11.2020, 21:48 |
|
Несколько глупых вопросов по std::string и std::wstring
|
|||
---|---|---|---|
#18+
Dima T Попытаюсь пованговать: он вывод какого-то консольного приложения перехватывает и хочет анализировать, но не понимает как это сделать. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.11.2020, 23:00 |
|
Несколько глупых вопросов по std::string и std::wstring
|
|||
---|---|---|---|
#18+
ResourceSpace Приводить бы их как-то к единому заданному виду, что ли? Как-то можно? ... |
|||
:
Нравится:
Не нравится:
|
|||
11.11.2020, 06:00 |
|
Несколько глупых вопросов по std::string и std::wstring
|
|||
---|---|---|---|
#18+
ResourceSpace в W-функциях WinAPI используется что именно - UTF-16 или UCS-2? UTF-16 ... |
|||
:
Нравится:
Не нравится:
|
|||
11.11.2020, 09:55 |
|
Несколько глупых вопросов по std::string и std::wstring
|
|||
---|---|---|---|
#18+
mayton , спасибо за ссылку, любопытно. Но неужели надо вот так вот по-всякому изворачиваться для стандартной операции над строкой? И функции ltrim() / rtrim() у меня не компилится, не понимает "<>" для "std::isspace". Надо что-то подключить? Первый раз в жизни вижу ошибку компиляции вида "X не требуется" , смешно. :) Dimitry Sibiryakov , Dima T , нет, программист никогда не писавший на С/С++ создал проект в VS и обнаружил что в С++ нет нормального встроенного типа данных "строка". Зато есть просто куча разных непонятных библиотек, в которых кто во что горазд, и непонятно что и как лучше выбрать вообще. Ну вот взял я std::[w]string - и чего, и как? Dimitry Sibiryakov ... все эти методы описаны в документации: ...
Dimitry Sibiryakov ... чтобы в строке были '\r' или '\n' - верится с трудом ... PetroNotC Sharp У тебя Нетипичные спец символы ... мусорная свалка. PetroNotC Sharp Вполне можешь в цикле посимвольно их убрать. PetroNotC Sharp Библиотечные функции обычно например, убрать пробелы в конце или начале. Остальные пункты всё ещё глухо? ... |
|||
:
Нравится:
Не нравится:
|
|||
11.11.2020, 15:09 |
|
Несколько глупых вопросов по std::string и std::wstring
|
|||
---|---|---|---|
#18+
ResourceSpaceВы чего, какие "нетипичные", какая "свалка" - это же обычные переводы на новую строку, в любом тексте они пачками. При попадании "любого текста" в строку они автоматически исчезают. Так что ты с воображаемыми проблемами борешься. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
11.11.2020, 15:21 |
|
Несколько глупых вопросов по std::string и std::wstring
|
|||
---|---|---|---|
#18+
ResourceSpace это же обычные переводы на новую строку, в любом тексте они пачками. Там где куча спец знаков с которыми надо бороться. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.11.2020, 15:22 |
|
Несколько глупых вопросов по std::string и std::wstring
|
|||
---|---|---|---|
#18+
ResourceSpace Остальные пункты всё ещё глухо? Проход посимвольно в цикле для std::string тут наверно было. Или нет? ... |
|||
:
Нравится:
Не нравится:
|
|||
11.11.2020, 15:24 |
|
Несколько глупых вопросов по std::string и std::wstring
|
|||
---|---|---|---|
#18+
Если так уж трудно работать с <wstring>, то загрузи С-библиотеку <cwchar>. Там куча понятных и простых функций... http://www.cplusplus.com/reference/cwchar ... |
|||
:
Нравится:
Не нравится:
|
|||
11.11.2020, 15:41 |
|
Несколько глупых вопросов по std::string и std::wstring
|
|||
---|---|---|---|
#18+
ResourceSpace Dimitry Sibiryakov , Dima T , нет, программист никогда не писавший на С/С++ создал проект в VS и обнаружил что в С++ нет нормального встроенного типа данных "строка". Тут еще много чего нет что везде есть, а еще кое-что совсем не так. Все присутствующие это прекрасно знают и искренне не понимают на которую из граблей ты наступил, а гадать просто устанешь. Ты начинай писать код, приводи пример того что не работает, подскажут. ResourceSpace Зато есть просто куча разных непонятных библиотек, в которых кто во что горазд, и непонятно что и как лучше выбрать вообще. Ну вот взял я std::[w]string - и чего, и как? В С/С++ нет нормальных строк потому что изначально строкой был массив char[], т.е. символы в однобайтовой ASCII кодировке. Потом для удобства сделали класс std::string, по сути это обертка над char[]. Потом появился тип wchar_t двухбайтовый, для UTF-16, соответственно строка в виде массива wchar_t[] и обертка std::wstring. Ну и куча сторонних библиотек. PS WinAPI с буковкой W на конце для wchar_t[], с A для char[], вообще без буквы - выбор задается в свойствах проекта, по умолчанию W ... |
|||
:
Нравится:
Не нравится:
|
|||
11.11.2020, 15:48 |
|
Несколько глупых вопросов по std::string и std::wstring
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov , PetroNotC Sharp - уж простите, но какие-то вы просто тролли. "Нетипичные"? "Исчезают"? Объясняю последний раз, и последующие высказывания про переводы строк просто игнорирую. Берём ваши цитаты: Dimitry Sibiryakov Так что ты с воображаемыми проблемами борешься. PetroNotC Sharp Дай ссыль на такой текст как Типичный и Распространенный. Там где куча спец знаков с которыми надо бороться. Если выделить текст любой из ваших цитат и скопировать в буфер обмена - в буфере обмена тоже будут содержаться символы "\r" и "\n". Если вставить текст из буфера обмена в программу "Блокнот" и сохранить в файл - в дочернем окне "Блокнота" с классом EDIT будет установлен текст, содержащий символы "\r" и "\n", и в файле тоже будут символы "\r" и "\n". Для вас это сюрприз..? Dima T , да это я всё знаю, десяток лет WinAPI и COM пользуюсь. Только из языков с нормальными строками. Просто думал что уж за столько лет и столько версий как VS так и самого C++ - можно же уже было сделать нормально? Каждую простейшую стандартную операцию над текстом придётся отдельно гуглить и писать свои реализации? Это же капец, не? Dima T приводи пример того что не работает, подскажут. Ну вот из того что я нагуглил, но работает почему-то частично: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
Не понимаю, а словами без кода не было понятно что требуется? А пример trim'ов со stackoverflow по ссылке выше, как я уже писал - просто не компилится, вероятнее всего нужен ещё #include, но я не нашёл какой. Ещё я спрашивал про конвертацию std::string <~> std::wstring - нормально ли будет через MultiByteToWideChar и WideCharToMultiByte, или в самой этой "std::" для этого уже что-то есть? d7i , большое спасибо, посмотрю. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.11.2020, 17:26 |
|
|
start [/forum/topic.php?fid=57&msg=40017195&tid=2017297]: |
0ms |
get settings: |
10ms |
get forum list: |
12ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
181ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
62ms |
get tp. blocked users: |
2ms |
others: | 255ms |
total: | 545ms |
0 / 0 |