Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / C++ Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2 3 4   вперед  Ctrl      все
 Несколько глупых вопросов по std::string и std::wstring  [new]
ResourceSpace
Member

Откуда:
Сообщений: 27
Добрый день!

Начал писать мини-проект: консольное приложение для 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 ноя 20, 14:52    [22229603]     Ответить | Цитировать Сообщить модератору
 Re: Несколько глупых вопросов по std::string и std::wstring  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 6525
ResourceSpace
получил текст из W-функции WinAPI, засунул его в std::wstring, но оказалось что в этом тексте куча символов "\r" и "\n" - как бы их убрать попроще?
код дай
10 ноя 20, 15:41    [22229633]     Ответить | Цитировать Сообщить модератору
 Re: Несколько глупых вопросов по std::string и std::wstring  [new]
Dima T
Member

Откуда:
Сообщений: 15282
ResourceSpace
И ещё консоль как-то криво выводит строки, в которых разные сочетания "\r" и "\n" (с этим я пока не выявил зависимость)

Это спецсимволы для управления курсором в консоли:
"\r" - возврат курсора в начало текущей строки, если что-то было в строке, то новое будет писаться поверх старого
"\n" - переход в начало следующей строки

https://ru.wikipedia.org/wiki/Перевод_строки
10 ноя 20, 15:49    [22229638]     Ответить | Цитировать Сообщить модератору
 Re: Несколько глупых вопросов по std::string и std::wstring  [new]
mayton
Member

Откуда: loopback
Сообщений: 49763
ResourceSpace

И ещё консоль как-то криво выводит строки, в которых разные сочетания "\r" и "\n" (с этим я пока не выявил зависимость). Приводить бы их как-то к единому заданному виду, что ли? Как-то можно?

Исторически сложилось что переводы строк не стандартизированы. Это может быть Unix-перевод строки (1 символ \n)
или DOS/Windows-вариант (\n\r).

Поэтому обрабатыай все ситуации.
10 ноя 20, 16:05    [22229651]     Ответить | Цитировать Сообщить модератору
 Re: Несколько глупых вопросов по std::string и std::wstring  [new]
ResourceSpace
Member

Откуда:
Сообщений: 27
Переводы строк мне хорошо известны. Вопрос был как раз как их обрабатывать, когда они в std::string или std::wstring.

PetroNotC Sharp
код дай

Какой код? Внутри переменной типа std::wstring текст оканчивающийся на "\r\n\r\n\r\n" - как их убрать, допустим, только с конца? И как, если надо из всего текста?

ResourceSpace
И ещё консоль как-то криво выводит строки, в которых разные сочетания "\r" и "\n" (с этим я пока не выявил зависимость).

Всё, выявил. При выводе в консоль нельзя чтоб в строке было одинокое "\r". Хотя тут можно было и так догадаться. :)
Однако, оказалось что в идеале должно быть наоборот одинокое "\n". По крайней мере для mode используемом на данный момент. хм...
10 ноя 20, 17:02    [22229685]     Ответить | Цитировать Сообщить модератору
 Re: Несколько глупых вопросов по std::string и std::wstring  [new]
mayton
Member

Откуда: loopback
Сообщений: 49763
ResourceSpace

Какой код? Внутри переменной типа std::wstring текст оканчивающийся на "\r\n\r\n\r\n" - как их убрать, допустим, только с конца? И как, если надо из всего текста?

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

Этож не сложно?
10 ноя 20, 17:29    [22229704]     Ответить | Цитировать Сообщить модератору
 Re: Несколько глупых вопросов по std::string и std::wstring  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 51775

ResourceSpace
Вопрос был как раз /как их обрабатывать/, когда они в std::string или std::wstring.

Обычно - никак, потому что в строках эти символы сами собой не появляются без (весьма
значительных) усилий со стороны программиста.

Posted via ActualForum NNTP Server 1.5

10 ноя 20, 18:10    [22229734]     Ответить | Цитировать Сообщить модератору
 Re: Несколько глупых вопросов по std::string и std::wstring  [new]
ResourceSpace
Member

Откуда:
Сообщений: 27
Dimitry Sibiryakov
Обычно - никак
Как никак? std:: вообще не поддерживает работу со своим содержимым?
Поиск подстроки, замена подстроки, конкатенация, в верхний регистр, в нижний регистр - не, ненада ничего? :)
mayton
Не кипятись.
Никто не кипятился. :) Просто поясняю - вопрос задан относительно работы с типом данных, в общем случае, а не какой-то узкой ситуации, теоретический вопрос.
В функцию передан std::wstring, текст может быть какой угодно, он извне. Надо убрать из текста "\r\n" - в одном случае только в конце, в другом во всём тексте.
mayton
Этож не сложно?
Ну вот вам такое:
void tripleOut(const std::wstring& str) {
	wprintf(L"%ls\n%ls\n%ls", str.c_str(), str.c_str(), str.c_str());
}

void myFunc(const std::wstring& str) {
	// str приходит извне, от меня её содержимое не зависит никак;
	// а содержимое str может оканчиваться на \r\n или на \r\n\r\n или на \r\n\r\n\r\n - надо их все убрать;
	// чисто для примера:
	tripleOut(str);
}
Ожидаю:
C:\Utils>myApp.exe
line
line
line
C:\Utils>
А получается:
C:\Utils>myApp.exe
line



line



line



C:\Utils>
А по остальным пунктам пока глухо?
10 ноя 20, 19:41    [22229777]     Ответить | Цитировать Сообщить модератору
 Re: Несколько глупых вопросов по std::string и std::wstring  [new]
mayton
Member

Откуда: loopback
Сообщений: 49763
ResourceSpace, ну вот твой кейс. Пока строчка еще std - надо из нее отрезать все "spacers" справа (rtrim())
и только потом в конце преобразовать в С-строку.

https://stackoverflow.com/questions/25829143/trim-whitespace-from-a-string/25829178
10 ноя 20, 19:47    [22229781]     Ответить | Цитировать Сообщить модератору
 Re: Несколько глупых вопросов по std::string и std::wstring  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 51775

ResourceSpace
Поиск подстроки, замена подстроки, конкатенация, в верхний регистр, в нижний регистр - не,
ненада ничего? :)

Есть. Внезапно, но все эти методы описаны в документации:
https://en.cppreference.com/w/cpp/string/basic_string/

Но вот чтобы в строке были '\r' или '\n' - верится с трудом. Пусть даже она и "приходит
извне".

Posted via ActualForum NNTP Server 1.5

10 ноя 20, 20:01    [22229784]     Ответить | Цитировать Сообщить модератору
 Re: Несколько глупых вопросов по std::string и std::wstring  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 6525
Библиотечные функции обычно например, убрать пробелы в конце или начале.
У тебя Нетипичные спец символы.
Вполне можешь в цикле посимвольно их убрать.
И действительно разберись, почему тебе приходит на вход мусорная свалка.
10 ноя 20, 20:44    [22229801]     Ответить | Цитировать Сообщить модератору
 Re: Несколько глупых вопросов по std::string и std::wstring  [new]
Dima T
Member

Откуда:
Сообщений: 15282
Попытаюсь пованговать: он вывод какого-то консольного приложения перехватывает и хочет анализировать, но не понимает как это сделать.
10 ноя 20, 20:49    [22229802]     Ответить | Цитировать Сообщить модератору
 Re: Несколько глупых вопросов по std::string и std::wstring  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 51775

Dima T
Попытаюсь пованговатьь: он вывод какого-то консольного приложения перехватывает

Не, это слишком сложно. Ставлю на то, что он эти классы использует как буфер. Типа:
read(f, 100, string.begin());

Posted via ActualForum NNTP Server 1.5

10 ноя 20, 21:07    [22229807]     Ответить | Цитировать Сообщить модератору
 Re: Несколько глупых вопросов по std::string и std::wstring  [new]
mayton
Member

Откуда: loopback
Сообщений: 49763
Dima T
Попытаюсь пованговать: он вывод какого-то консольного приложения перехватывает и хочет анализировать, но не понимает как это сделать.

Дык этож для Перл задачка! А где этот Прохоров-Милторг? Он щас тут быстро всё порешает одной регуляркой.

Офигеете как это жутко красиво будет.
10 ноя 20, 21:48    [22229820]     Ответить | Цитировать Сообщить модератору
 Re: Несколько глупых вопросов по std::string и std::wstring  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 6525
Dima T
Попытаюсь пованговать: он вывод какого-то консольного приложения перехватывает и хочет анализировать, но не понимает как это сделать.
одно то что он это скрывает, уже характеризует его характер))))
10 ноя 20, 23:00    [22229859]     Ответить | Цитировать Сообщить модератору
 Re: Несколько глупых вопросов по std::string и std::wstring  [new]
CEMb
Member

Откуда: Столько
Сообщений: 2129
ResourceSpace
Приводить бы их как-то к единому заданному виду, что ли? Как-то можно?
std::endl?
11 ноя 20, 06:00    [22229925]     Ответить | Цитировать Сообщить модератору
 Re: Несколько глупых вопросов по std::string и std::wstring  [new]
Изопропил
Member

Откуда:
Сообщений: 31536
ResourceSpace
в W-функциях WinAPI используется что именно - UTF-16 или UCS-2?

UTF-16
11 ноя 20, 09:55    [22229962]     Ответить | Цитировать Сообщить модератору
 Re: Несколько глупых вопросов по std::string и std::wstring  [new]
ResourceSpace
Member

Откуда:
Сообщений: 27
mayton, спасибо за ссылку, любопытно. Но неужели надо вот так вот по-всякому изворачиваться для стандартной операции над строкой?
И функции ltrim() / rtrim() у меня не компилится, не понимает "<>" для "std::isspace". Надо что-то подключить?
Первый раз в жизни вижу ошибку компиляции вида "X не требуется", смешно. :)

Dimitry Sibiryakov, Dima T, нет, программист никогда не писавший на С/С++ создал проект в VS и обнаружил что в С++ нет нормального встроенного типа данных "строка".
Зато есть просто куча разных непонятных библиотек, в которых кто во что горазд, и непонятно что и как лучше выбрать вообще. Ну вот взял я std::[w]string - и чего, и как?
Dimitry Sibiryakov
... все эти методы описаны в документации: ...
По вашей ссылке:
  • конкатенация - есть, работает, даже через просто операцию "+", отлично;
  • поиск подстроки - вроде есть, a sort of (в каком-то виде);
  • замена подстроки - якобы есть, но если вчитаться - оно как-то через попу, нормальном виде нема?
  • в верхний регистр - не вижу;
  • в нижний регистр - не вижу;
  • trim / trim-left / trim-right - не вижу;
А некоторые методы типа starts_with() и ends_with() помечены как "C++20". А у меня вроде максимум "11" можно. Как вы вообще работаете со строками все эти года? %))
Dimitry Sibiryakov
... чтобы в строке были '\r' или '\n' - верится с трудом ...
PetroNotC Sharp
У тебя Нетипичные спец символы ... мусорная свалка.
Вы чего, какие "нетипичные", какая "свалка" - это же обычные переводы на новую строку, в любом тексте они пачками.
PetroNotC Sharp
Вполне можешь в цикле посимвольно их убрать.
Был бы обычный массив - легко бы убрал давно. А вот как это сделать - когда оно в std::string / std::wstring?
PetroNotC Sharp
Библиотечные функции обычно например, убрать пробелы в конце или начале.
Как называется эта "библиотечная функция убрать пробелы в конце или начале" и в каком заголовке/инклюде она находится?

Остальные пункты всё ещё глухо?
11 ноя 20, 15:09    [22230173]     Ответить | Цитировать Сообщить модератору
 Re: Несколько глупых вопросов по std::string и std::wstring  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 51775

ResourceSpace
Вы чего, какие "нетипичные", какая "свалка" - это же обычные переводы на новую строку, в
любом тексте они пачками.

При попадании "любого текста" в строку они автоматически исчезают. Так что ты с
воображаемыми проблемами борешься.

Posted via ActualForum NNTP Server 1.5

11 ноя 20, 15:21    [22230180]     Ответить | Цитировать Сообщить модератору
 Re: Несколько глупых вопросов по std::string и std::wstring  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 6525
ResourceSpace
это же обычные переводы на новую строку, в любом тексте они пачками.
гугл перед носом? Дай ссыль на такой текст как Типичный и Распространенный.
Там где куча спец знаков с которыми надо бороться.

Сообщение было отредактировано: 11 ноя 20, 15:20
11 ноя 20, 15:22    [22230181]     Ответить | Цитировать Сообщить модератору
 Re: Несколько глупых вопросов по std::string и std::wstring  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 6525
ResourceSpace
Остальные пункты всё ещё глухо?
повтори какие.
Проход посимвольно в цикле для std::string тут наверно было. Или нет?
11 ноя 20, 15:24    [22230184]     Ответить | Цитировать Сообщить модератору
 Re: Несколько глупых вопросов по std::string и std::wstring  [new]
d7i
Member

Откуда:
Сообщений: 522
Если так уж трудно работать с <wstring>, то загрузи С-библиотеку <cwchar>.
Там куча понятных и простых функций...
http://www.cplusplus.com/reference/cwchar
11 ноя 20, 15:41    [22230195]     Ответить | Цитировать Сообщить модератору
 Re: Несколько глупых вопросов по std::string и std::wstring  [new]
Dima T
Member

Откуда:
Сообщений: 15282
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 ноя 20, 15:46
11 ноя 20, 15:48    [22230204]     Ответить | Цитировать Сообщить модератору
 Re: Несколько глупых вопросов по std::string и std::wstring  [new]
ResourceSpace
Member

Откуда:
Сообщений: 27
Dimitry Sibiryakov, PetroNotC Sharp - уж простите, но какие-то вы просто тролли. "Нетипичные"? "Исчезают"?
Объясняю последний раз, и последующие высказывания про переводы строк просто игнорирую. Берём ваши цитаты:
Dimitry Sibiryakov
Так что ты с
воображаемыми проблемами борешься.
PetroNotC Sharp
Дай ссыль на такой текст как Типичный и Распространенный.
Там где куча спец знаков с которыми надо бороться.
В данном тексте, написанном и отправленным на форум вами - содержатся символы "\r" и "\n".
Если выделить текст любой из ваших цитат и скопировать в буфер обмена - в буфере обмена тоже будут содержаться символы "\r" и "\n".
Если вставить текст из буфера обмена в программу "Блокнот" и сохранить в файл - в дочернем окне "Блокнота" с классом EDIT будет установлен текст, содержащий символы "\r" и "\n", и в файле тоже будут символы "\r" и "\n".
Для вас это сюрприз..?



Dima T, да это я всё знаю, десяток лет WinAPI и COM пользуюсь. Только из языков с нормальными строками.
Просто думал что уж за столько лет и столько версий как VS так и самого C++ - можно же уже было сделать нормально?
Каждую простейшую стандартную операцию над текстом придётся отдельно гуглить и писать свои реализации? Это же капец, не?
Dima T
приводи пример того что не работает, подскажут.
У меня нет неработающего. Просто нужно производить со строками стандартные операции, нужна модификация текста. А я без понятия как, привычных методов или функций тупо нету.
Ну вот из того что я нагуглил, но работает почему-то частично:
void toLower(std::wstring& str) { // req: <algorithm>
	std::transform(str.begin(), str.end(), str.begin(), std::tolower);
}

void myFunc(std::wstring& str) {
	// str приходит извне, от меня её содержимое не зависит никак;
	wprintf(L"%ls\n", str.c_str()); // допустим, выведет такое: CHEck ПРОверка
	toLower(str);
	wprintf(L"%ls\n", str.c_str()); // тогда тут выведет уже: check ПРОверка
	// и чего оно кириллицу не тронуло, а? надо чтоб было: check проверка
	// при этом - украинский, немецкий и греческий - тоже вполне может быть в тексте
}
Не понимаю, а словами без кода не было понятно что требуется?
А пример trim'ов со stackoverflow по ссылке выше, как я уже писал - просто не компилится, вероятнее всего нужен ещё #include, но я не нашёл какой.
Ещё я спрашивал про конвертацию std::string <~> std::wstring - нормально ли будет через MultiByteToWideChar и WideCharToMultiByte, или в самой этой "std::" для этого уже что-то есть?

d7i, большое спасибо, посмотрю.
11 ноя 20, 17:26    [22230293]     Ответить | Цитировать Сообщить модератору
 Re: Несколько глупых вопросов по std::string и std::wstring  [new]
Cerebrum
Member

Откуда: Омикрон Персей 8
Сообщений: 7980
поиск и удаление \r\n и не только
11 ноя 20, 17:51    [22230319]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2 3 4   вперед  Ctrl      все
Все форумы / C++ Ответить