Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / C++ Новый топик    Ответить
Топик располагается на нескольких страницах: 1 2 3 4      [все]
 Несколько глупых вопросов по 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
Сообщений: 49762
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
Сообщений: 49762
ResourceSpace

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

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

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

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

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
Сообщений: 49762
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

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

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

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

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
Сообщений: 49762
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

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

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

Откуда:
Сообщений: 6525
ResourceSpace,
Ты тролль?
Вопрос был такой - Зачем бороться и удалять символы конца строки?
Ты ответил
автор
В данном тексте, написанном и отправленным на форум вами - содержатся символы "\r" и "\n".
Если выделить текст любой из ваших цитат и скопировать в буфер обмена - в буфере обмена тоже будут содержаться символы "\r" и "\n".
Если вставить текст из буфера обмена в программу "Блокнот" и сохранить в файл - в дочернем окне "Блокнота" с классом EDIT будет установлен текст, содержащий символы "\r" и "\n", и в файле тоже будут символы "\r" и "\n".
Для вас это сюрприз..?

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

Откуда:
Сообщений: 27
Что значит "зачем"? Потому что в тексте они есть по факту, а мне нужен текст без них.
Абсолютно нормальные символы для многострочного текста. И с чего бы им самим куда-то там "пропадать"?
Неужели не достаточно частая задача - сделать тексту Trim()?

Да хоть такое для теста взять, предположим вот чужой код:
int wmain(int argc, wchar_t* argv[]) {
	std::wstring str = L"Однажды\r\nВ студёную зимнюю пору,\r\nЯ из лесу вышел,\r\nБыл сильный мороз...  \t   \r\n   \r\n   \r\n   \r\n";
	myFunc(str);
	return 0;
}
Не важно откуда оно там взялось, передали так из другого места. Мой вопрос был - как лишнее убирать внутри моей myFunc().


Cerebrum, спасибо огромное! Пошёл читать... :3
11 ноя 20, 18:44    [22230358]     Ответить | Цитировать Сообщить модератору
 Re: Несколько глупых вопросов по std::string и std::wstring  [new]
Dimitry Sibiryakov
Member

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

ResourceSpace
В данном тексте, написанном и отправленным на форум /_вами_/ - содержатся символы "\r" и "\n".
Если выделить текст любой из ваших цитат и скопировать в буфер обмена - в буфере обмена
тоже будут содержаться символы "\r" и "\n".
Если вставить текст из буфера обмена в программу "Блокнот" и сохранить в файл - в дочернем
окне "Блокнота" с классом EDIT будет установлен текст, содержащий символы "\r" и "\n", и в
файле тоже будут символы "\r" и "\n".
Для вас это сюрприз..?

Лично для меня сюрприз, что ты в этом списке нигде не упомянул std::string. Неужели таки
дошло, что оно с "данным текстом" никак не соотносится?..

Posted via ActualForum NNTP Server 1.5

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

Откуда:
Сообщений: 27
Я могу на любом из перечисленных этапов получать текст - хоть из сети, хоть из буфера обмена, хоть из окна, хоть из файла - и хранить в переменной типа std::wstring.
С чего бы "\r" и "\n" куда-то при этом пропадали?
11 ноя 20, 18:53    [22230364]     Ответить | Цитировать Сообщить модератору
 Re: Несколько глупых вопросов по std::string и std::wstring  [new]
Dimitry Sibiryakov
Member

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

ResourceSpace
С чего бы "\r" и "\n" куда-то при этом пропадали?

Обычно они пропадают "с процесса получения текста". Ты не поверишь, но std::string это тип
для хранения СТРОКИ. Одной строки. И все вменяемые функции кладут в переменные
данного типа ОДНУ строку.

Но, конечно, ты волен писать собственные функции любой степени невменяемости.

Posted via ActualForum NNTP Server 1.5

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

Откуда:
Сообщений: 27
Как же по вашему хранится многострочный текст? Вы не в курсе что в WinAPI многострочный текст это один единый массив символов? И во всех нормальных языках тоже?
https://en.cppreference.com/w/cpp/string/basic_string
The class template basic_string stores and manipulates sequences of char-like objects
В вашей же справке написано - не для "одной строки", а для "последовательности символов".
11 ноя 20, 19:08    [22230374]     Ответить | Цитировать Сообщить модератору
 Re: Несколько глупых вопросов по std::string и std::wstring  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 6525
ResourceSpace
Не важно откуда оно там взялось, передали так из другого места.

Ну, во первых, профи программист а не тупой кодировщик всегда смотрит на ранг выше и ниже задачу.
Во вторых, мы народ любознательный, и нам просто интересно. Какой идиот дает тебе на вход 20 Enter.
Справедливо?
...
Ну и если ты трижды повторишь: "так надо!" - от тебя отстанут.
Мало ли чудаков на свете.

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

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

ResourceSpace
Как же по вашему хранится многострочный текст?

Так, как требует того задача. От потока байт до массива строк.

ResourceSpace
Вы не в курсе что в WinAPI многострочный текст это один единый массив символов?

Я в курсе, что в WinAPI вообще нет понятия "текст", а только тот самый "массив символов".
А ты понимаешь, что WinAPI это НЕ С++?

ResourceSpace
И во всех нормальных языках тоже?

Потребовать что ли от модератора тебя забанить за такое наглое размахивание чужим уставом?..

Posted via ActualForum NNTP Server 1.5

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

Откуда:
Сообщений: 6525
Кстати, по мотивам.
Есть в МосЭнерго личный кабинет. И там есть окошко для обращения граждан.
Дак вот, при вводе конечно стараешься формулировать мысль))), оформлять абзацы.
А при сохранении получаем сплошняком текст без концов строк.
Хорошо пробелы оставили))).
Уж не знаю. Может место экономят. Мож экран.
11 ноя 20, 19:25    [22230386]     Ответить | Цитировать Сообщить модератору
 Re: Несколько глупых вопросов по std::string и std::wstring  [new]
ResourceSpace
Member

Откуда:
Сообщений: 27
Я выдумал и привёл аж четыре реальных примера откуда оно могло взяться - этого недостаточно? Особенно учитывая что к непосредственно вопросу это не имело отношения.
Ладно, выдумал пятый пример - прочитать текст из реестра. Технически там нет явных запретов/ограничений на многострочный REG_SZ.



Моя задача и требует - идентично WinAPI.

Хорошо, хорошо... "И в любых языках в которых есть встроенный тип данных строка" - лучше?
11 ноя 20, 19:28    [22230390]     Ответить | Цитировать Сообщить модератору
 Re: Несколько глупых вопросов по std::string и std::wstring  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 6525
ResourceSpace
Я выдумал

ResourceSpace
реальных примера
))))) LOL
Как у тебя с логикой?
Выдумал или реальных?
Я вот выше не выдуманный пример привел.

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

Откуда:
Сообщений: 6525
ResourceSpace
выдумал пятый пример
а зачем там то удалять?
В реестре каждый знак значимый.
11 ноя 20, 19:36    [22230396]     Ответить | Цитировать Сообщить модератору
 Re: Несколько глупых вопросов по std::string и std::wstring  [new]
ResourceSpace
Member

Откуда:
Сообщений: 27
Я сказал прочитать из реестра, а не перезаписывать в нём.

Прочитали текущее текстовое содержимое из буфера обмена. Там какой-то текст и после него 20 Enter. Кто-то может специально или случайно скопировать в буфер 20 Enter? Может.
Да, вполне себе реальный пример. Теперь надо убрать нафик 20 Enter и перевести в нижний регистр. И поискать какую-нибудь подстроку.
Тож самое из реестра. Из файла. Из стрима. Источник не важен - мы его не контролируем.

Надо было наверное на каждый мини-вопрос отдельную тему создавать, а то в один вцепились, другие вообще не заметили...
11 ноя 20, 19:44    [22230398]     Ответить | Цитировать Сообщить модератору
 Re: Несколько глупых вопросов по std::string и std::wstring  [new]
Dimitry Sibiryakov
Member

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

ResourceSpace
Я выдумал и привёл аж четыре реальных примера откуда оно могло взяться - этого недостаточно?

Что "оно"? Ты привёл примеры откуда мог взяться массив символов. std::string оттуда
взяться никак не мог.

ResourceSpace
Ладно, выдумал пятый пример - прочитать текст из реестра. Технически там нет явных
запретов/ограничений на многострочный REG_SZ.

Технически нет в природе функций, позволяющих получить из реестра std::string.

Posted via ActualForum NNTP Server 1.5

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

Откуда:
Сообщений: 1349
PetroNotC Sharp,>не понимает "<>"
Поясни, о чем речь?
11 ноя 20, 19:48    [22230403]     Ответить | Цитировать Сообщить модератору
 Re: Несколько глупых вопросов по std::string и std::wstring  [new]
d7i
Member

Откуда:
Сообщений: 522
Весь сыр-бор разгорелся из-того, что ТС по-сути талдычит о буфере, который он пытается уложить в строковый тип...
И ясно, что разные функции обработки строк тут не канают.
А по-моему нужно взять буфер из TCHAR и тогда всё станет более-менее ясно.
#ifdef _UNICODE
typedef wchar_t TCHAR;
#else
typedef char TCHAR;
#endif
11 ноя 20, 19:49    [22230404]     Ответить | Цитировать Сообщить модератору
 Re: Несколько глупых вопросов по std::string и std::wstring  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 6525
Я пишу:
PetroNotC Sharp
а зачем там то удалять?[спецсимволы предварительно вычитав оттуда]

ТС отвечает:
ResourceSpace
Я сказал прочитать из реестра, а не перезаписывать в нём.

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

Откуда:
Сообщений: 6525
ResourceSpace
Кто-то может специально или случайно скопировать в буфер 20 Enter? Может.
не люблю прогеров ставящих себе дурацкие задачи.
"Может обезьяна тупо стуча по печатной машинке набить Войну и мир? Может!
11 ноя 20, 19:56    [22230410]     Ответить | Цитировать Сообщить модератору
 Re: Несколько глупых вопросов по std::string и std::wstring  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 6525
ъъъъъ
PetroNotC Sharp,>не понимает "<>"
Поясни, о чем речь?
поясняю.
ТС почему то борется если ему пришло 20 Enter.
А если пришло 20 тире то не борется.
Правильно ли это?
11 ноя 20, 20:01    [22230415]     Ответить | Цитировать Сообщить модератору
 Re: Несколько глупых вопросов по std::string и std::wstring  [new]
Dimitry Sibiryakov
Member

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

ResourceSpace
Прочитали текущее текстовое содержимое из буфера обмена. Там какой-то текст и после него
20 Enter. Кто-то может специально или случайно скопировать в буфер 20 Enter? Может.

Может, но у тебя ошибка уже в первом посыле "прочитали". В С++ нет функций для работы с
буфером обмена, прочитать его невозможно.

Posted via ActualForum NNTP Server 1.5

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

Откуда:
Сообщений: 15282
ResourceSpace
Ну вот из того что я нагуглил, но работает почему-то частично:
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 проверка
	// при этом - украинский, немецкий и греческий - тоже вполне может быть в тексте
}
Не понимаю, а словами без кода не было понятно что требуется?

Не было понятно. Лично я для такой хери С++ не использую, т.к. знаю что он это не умеет, есть высокоуровневые языки где все это из коробки. Давай отдельный топик поднимем про то как сделать мультиязычный tolower, это отдельная сложная задача если поставить ее кросплатформно!
ResourceSpace
Ещё я спрашивал про конвертацию std::string <~> std::wstring - нормально ли будет через MultiByteToWideChar и WideCharToMultiByte, или в самой этой "std::" для этого уже что-то есть?

Только MultiByteToWideChar и WideCharToMultiByte если в виндавсе, а в "std::" этого вообще нет.
11 ноя 20, 20:15    [22230422]     Ответить | Цитировать Сообщить модератору
 Re: Несколько глупых вопросов по std::string и std::wstring  [new]
Dima T
Member

Откуда:
Сообщений: 15282
ResourceSpace
Что значит "зачем"? Потому что в тексте они есть по факту, а мне нужен текст без них.
Абсолютно нормальные символы для многострочного текста. И с чего бы им самим куда-то там "пропадать"?
Неужели не достаточно частая задача - сделать тексту Trim()?

Да хоть такое для теста взять, предположим вот чужой код:
int wmain(int argc, wchar_t* argv[]) {
	std::wstring str = L"Однажды\r\nВ студёную зимнюю пору,\r\nЯ из лесу вышел,\r\nБыл сильный мороз...  \t   \r\n   \r\n   \r\n   \r\n";
	myFunc(str);
	return 0;
}
Не важно откуда оно там взялось, передали так из другого места. Мой вопрос был - как лишнее убирать внутри моей myFunc().


Cerebrum, спасибо огромное! Пошёл читать... :3

А что по твоему лишнее? Ты конкретно покажи как оно без лишнего должно быть. Допустим в итоге так получится
L"ОднаждыВ студёную зимнюю пору,Я из лесу вышел,Был сильный мороз...  \t            ";
Это правильно?
11 ноя 20, 20:21    [22230424]     Ответить | Цитировать Сообщить модератору
 Re: Несколько глупых вопросов по std::string и std::wstring  [new]
ResourceSpace
Member

Откуда:
Сообщений: 27
Я же в первом сообщении объяснял - приложение для Windows на C++.
Plain-WinAPI-код. Компилятор C++ MSVC. Единственный источник каких-либо входящих данных - функции WinAPI.
А там - голый wchar_t buf[] - который мне жутко надоел, даже конкатенацию не сделать. Просто заменил хранение как std::wstring.

Либо используем промежуточный wchar_t buf[], либо сразу помещаем в std::wstring через buf.c_str() - вполне себе можно получить текст, и из реестра, и откуда угодно.

ъъъъъ
Поясни, о чем речь?
Я говорю:
ResourceSpace
функции ltrim() / rtrim() у меня не компилится, не понимает "<>" для "std::isspace". Надо что-то подключить?
ResourceSpace
пример trim'ов со stackoverflow по ссылке выше, как я уже писал - просто не компилится, вероятнее всего нужен ещё #include, но я не нашёл какой.
Вот тот код со stackoverflow:
std::string& ltrim(std::string& str) {
	auto it2 = std::find_if(str.begin(), str.end(), [](char ch) { return !std::isspace<char>(ch, std::locale::classic()); });
	str.erase(str.begin(), it2);
	return str;
}

std::string& rtrim(std::string& str) {
	auto it1 = std::find_if(str.rbegin(), str.rend(), [](char ch) { return !std::isspace<char>(ch, std::locale::classic()); });
	str.erase(it1.base(), str.end());
	return str;
}
Вот ошибка компиляции:
MSVS
Предупреждение C4551 в вызове функции отсутствует список аргументов
Ошибка C2062 тип "char" не требуется
Эти пишет на каждый "char>" после "isspace<". При этом во всплывашке "использование имени типа не допускается".
Да 98% что какого-то #include не хватает, как бы выяснить какого именно?


Dima T
Допустим в итоге так получится
L"ОднаждыВ студёную зимнюю пору,Я из лесу вышел,Был сильный мороз...  \t            ";
Это правильно?
Такие стандартные штуки как TrimLeft и TrimRight удаляет пробельные символы только с одного края:
L"Однажды\r\nВ студёную зимнюю пору,\r\nЯ из лесу вышел,\r\nБыл сильный мороз...";
Но желательно до такого вида:
L"однажды\nв студёную зимнюю пору,\nя из лесу вышел,\nбыл сильный мороз...";
11 ноя 20, 20:33    [22230429]     Ответить | Цитировать Сообщить модератору
 Re: Несколько глупых вопросов по std::string и std::wstring  [new]
ъъъъъ
Member

Откуда:
Сообщений: 1349
Сомнений нет: ТС - тролль.
11 ноя 20, 20:39    [22230432]     Ответить | Цитировать Сообщить модератору
 Re: Несколько глупых вопросов по std::string и std::wstring  [new]
ResourceSpace
Member

Откуда:
Сообщений: 27
С чего вдруг? Вы просили пояснить проблему - я пояснил.
Могу в виде скриншота показать:

К сообщению приложен файл. Размер - 47Kb
11 ноя 20, 20:45    [22230434]     Ответить | Цитировать Сообщить модератору
 Re: Несколько глупых вопросов по std::string и std::wstring  [new]
Dima T
Member

Откуда:
Сообщений: 15282
ResourceSpace
Я же в первом сообщении объяснял - приложение для Windows на C++.
Plain-WinAPI-код. Компилятор C++ MSVC. Единственный источник каких-либо входящих данных - функции WinAPI.
А там - голый wchar_t buf[] - который мне жутко надоел, даже конкатенацию не сделать. Просто заменил хранение как std::wstring.

Тут сложение легко, а выкидывание символов делать замаешься, т.к. нет прямого доступа на запись внутрь std::wstring. Лучше бы оставил голый wchar_t buf[]


ResourceSpace
Либо используем промежуточный wchar_t buf[], либо сразу помещаем в std::wstring через buf.c_str() - вполне себе можно получить текст, и из реестра, и откуда угодно.

ъъъъъ
Поясни, о чем речь?
Я говорю:
ResourceSpace
функции ltrim() / rtrim() у меня не компилится, не понимает "<>" для "std::isspace". Надо что-то подключить?
ResourceSpace
пример trim'ов со stackoverflow по ссылке выше, как я уже писал - просто не компилится, вероятнее всего нужен ещё #include, но я не нашёл какой.
Вот тот код со stackoverflow:
std::string& ltrim(std::string& str) {
	auto it2 = std::find_if(str.begin(), str.end(), [](char ch) { return !std::isspace<char>(ch, std::locale::classic()); });
	str.erase(str.begin(), it2);
	return str;
}

std::string& rtrim(std::string& str) {
	auto it1 = std::find_if(str.rbegin(), str.rend(), [](char ch) { return !std::isspace<char>(ch, std::locale::classic()); });
	str.erase(it1.base(), str.end());
	return str;
}
Вот ошибка компиляции:
MSVS
Предупреждение C4551 в вызове функции отсутствует список аргументов
Ошибка C2062 тип "char" не требуется
Эти пишет на каждый "char>" после "isspace<". При этом во всплывашке "использование имени типа не допускается".
Да 98% что какого-то #include не хватает, как бы выяснить какого именно?


Если у тебя wchar_t то зачем используешь std::string в параметрах? он только с char работает. Для wchar_t есть std::wstring

ResourceSpace
Dima T
Допустим в итоге так получится
L"ОднаждыВ студёную зимнюю пору,Я из лесу вышел,Был сильный мороз...  \t            ";
Это правильно?
Такие стандартные штуки как TrimLeft и TrimRight удаляет пробельные символы только с одного края:
L"Однажды\r\nВ студёную зимнюю пору,\r\nЯ из лесу вышел,\r\nБыл сильный мороз...";
Но желательно до такого вида:
L"однажды\nв студёную зимнюю пору,\nя из лесу вышел,\nбыл сильный мороз...";

Завтра дам примеры кода
11 ноя 20, 20:48    [22230436]     Ответить | Цитировать Сообщить модератору
 Re: Несколько глупых вопросов по std::string и std::wstring  [new]
Dima T
Member

Откуда:
Сообщений: 15282
ъъъъъ
Сомнений нет: ТС - тролль.

Никакой он не тролль, просто офигел от тонкостей С/С++ как и все начинающие.
11 ноя 20, 20:50    [22230437]     Ответить | Цитировать Сообщить модератору
 Re: Несколько глупых вопросов по std::string и std::wstring  [new]
ResourceSpace
Member

Откуда:
Сообщений: 27
Это просто оригинальный код со stackoverflow.
Я его скопировал и сперва сразу поменял под UTF-16 - а оно и не работает.
Тогда думаю ну может я что-то не так подправил, испортил, вернул к оригинальному виду - а всё равно не хочет.

Насколько я смог понять - оно думает что std::isspace это обычная функция из <ctype.h>, а не шаблон. Возможно такой шаблон где-то в другом месте. Гугл от угловых скобок только путается.
Dima T
Лучше бы оставил голый wchar_t buf[]
Неудобно же вообще совсем. Так хоть что-то могу с ними делать.
Dima T
Завтра дам примеры кода
Спасибо большое!
11 ноя 20, 21:02    [22230446]     Ответить | Цитировать Сообщить модератору
 Re: Несколько глупых вопросов по std::string и std::wstring  [new]
Dima T
Member

Откуда:
Сообщений: 15282
ResourceSpace, почему С++ надо? Если виндавс и строки, то C# просится, там все есть, все просто, под начинающих заточено. В С++ чтобы осилить эту тему надо стать гуру.
11 ноя 20, 21:15    [22230450]     Ответить | Цитировать Сообщить модератору
 Re: Несколько глупых вопросов по std::string и std::wstring  [new]
Dimitry Sibiryakov
Member

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

Dima T
а в "std::" этого вообще нет.

Есть: https://en.cppreference.com/w/cpp/locale

ResourceSpace
Plain-WinAPI-код. Компилятор C++ MSVC. Единственный источник каких-либо входящих данных -
функции WinAPI.
А там - голый wchar_t buf[] - который мне жутко надоел, даже конкатенацию не сделать.

А если поискать?.. https://en.cppreference.com/w/c/string/wide/wcscat

Posted via ActualForum NNTP Server 1.5

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

Откуда:
Сообщений: 15282
Dimitry Sibiryakov

Dima T
а в "std::" этого вообще нет.

Есть: https://en.cppreference.com/w/cpp/locale

Ты как всегда сумничал, эта ссылка мне непонятна, а TCу тем более. Дай простой пример кода как сделать
tolower(L"CHEck ПРОверка")

чтобы получилось "check проверка"
11 ноя 20, 21:29    [22230457]     Ответить | Цитировать Сообщить модератору
 Re: Несколько глупых вопросов по std::string и std::wstring  [new]
Dimitry Sibiryakov
Member

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

Пример в https://en.cppreference.com/w/cpp/locale/tolower недостаточно доходчив?..

Posted via ActualForum NNTP Server 1.5

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

Откуда: Маями
Сообщений: 760
ResourceSpace,


Проблема \r\n (именно в таком порядке) и string/setting ортогональны.

В юниксах стояки разделяются \n, одним символом он же LF=10

ДОС сделал "умно" через CR/LF, чтоб текстовые файлы проще печатать на допотопные принтеры, а потом с этим и застряли..

Отсюдамвыросли новые хаки, вроде fopen( , "rt"), чтоб ловчее прятать эти уже никому не нужные CR.

Но они так и остались, как в файлах так и в памяти. Windows. Multiline Edit? CR/LF.

Ещё в Винде почему-то принято последнюю строку файла заканчивать CR/LF, как вроде там она нужна.

Новый проект в винде? Пишите все широкими "W" функциями,

Старый проект? Почитайте про SBCS/MBCS, там есть грабли.
12 ноя 20, 08:04    [22230545]     Ответить | Цитировать Сообщить модератору
 Re: Несколько глупых вопросов по std::string и std::wstring  [new]
Dima T
Member

Откуда:
Сообщений: 15282
ResourceSpace
Но желательно до такого вида:
L"однажды\nв студёную зимнюю пору,\nя из лесу вышел,\nбыл сильный мороз...";

+ Исходник
static void clean(std::wstring& str) {
	// Убираем несколько \r \n подряд с заменой на один \n
	bool is_write = true;
	std::wstring::iterator p = str.begin();

	for(std::wstring::iterator i = str.begin(); i != str.end(); i++) {
		switch(*i) {
		case L'\r':
			*i = L'\n';

		case L'\n':
			if(is_write) {
				*p = *i;
				p++;
				is_write = false;
			}
			break;

		default:
			*p = *i;
			p++;
			is_write = true;
		}

	}

	// Убраем замыкающие переводы строк, пробелы и табуляции
	for(; p != str.begin(); p--) {
		if(*p != L'\n' && *p != L'\t'&& *p != L' ') {
			p++;
			break;
		}
	}

	// Обрезаем ненужный хвост
	if(p != str.end()) {
		str.resize(p - str.begin());
	}
}

int main() {
	std::wstring str = { L"Однажды\r\nВ студёную зимнюю пору,\r\nЯ из лесу вышел,\r\nБыл сильный мороз...  \t   \r\n   \r\n   \r\n   \r\n" };
	clean(str);
	for(auto& i : str ) printf("%d ", i);
	return 0;
}
12 ноя 20, 08:39    [22230556]     Ответить | Цитировать Сообщить модератору
 Re: Несколько глупых вопросов по std::string и std::wstring  [new]
Dimitry Sibiryakov
Member

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

Ну да, давайте в С++ писать как в С. Зачем вам вообще тогда плюсы?
std::wistringstream s(L"однажды\nв студёную зимнюю пору,\nя из лесу вышел,\nбыл 
сильный мороз...");
while (s)
{
   std::wstring c;
   s >> c;
   std::cout << c;
}

Posted via ActualForum NNTP Server 1.5

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

Откуда:
Сообщений: 6525
Dimitry Sibiryakov
Ну да, давайте в С++ писать как в С. Зачем вам вообще тогда плюсы?
std::wistringstream s(L"однажды\nв студёную зимнюю пору,\nя из лесу вышел,\nбыл 
сильный мороз...");
while (s)
{
   std::wstring c;
   s >> c;
   std::cout << c;
}

Не умничай а дай вариант для плюсов и для не плюсов.
12 ноя 20, 16:41    [22230911]     Ответить | Цитировать Сообщить модератору
 Re: Несколько глупых вопросов по std::string и std::wstring  [new]
Dimitry Sibiryakov
Member

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

PetroNotC Sharp
дай вариант

Вариант чего? Бессмысленного кода, годящегося только для лабы на первом курсе?..

Posted via ActualForum NNTP Server 1.5

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

Откуда: loopback
Сообщений: 49762
На самом деле это проблема. И проблема в системной необученности. Какой-то ВУЗ или преподаватель
продолжает штамповать на выходе "C" - шников. Далее эти сишники приходят в С++ и привносят туда
свой чудесный опыт. Далее - в нашем форуме появляется Несколько глупых вопросов....

Я как всегда считаю что автор нивчем неуиновный. А виновна система.
12 ноя 20, 17:25    [22230972]     Ответить | Цитировать Сообщить модератору
 Re: Несколько глупых вопросов по std::string и std::wstring  [new]
Dimitry Sibiryakov
Member

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

mayton
А виновна система.

Валить вину на кого-то другого это так по-детски... "Я не виноват, ваза сама со стола
спрыгнула!"

Posted via ActualForum NNTP Server 1.5

12 ноя 20, 17:29    [22230979]     Ответить | Цитировать Сообщить модератору
 Re: Несколько глупых вопросов по std::string и std::wstring  [new]
Dima T
Member

Откуда:
Сообщений: 15282
Dimitry Sibiryakov

Ну да, давайте в С++ писать как в С. Зачем вам вообще тогда плюсы?

Мну оно вообще незачем, я много раз говорил что я в плюсах разбираюсь как свинья в апельсинах, я С знаю и классы немного, я тупо молчал с начала топика, до тех пор пока вместо того чтобы помочь ТСа стали закидывать тухлыми помидорами. Я дал ему решение его проблемы, кто хочет дать решение лучше - дайте.
12 ноя 20, 19:02    [22231053]     Ответить | Цитировать Сообщить модератору
 Re: Несколько глупых вопросов по std::string и std::wstring  [new]
ResourceSpace
Member

Откуда:
Сообщений: 27
ого! Пожалуй даже красиво. Спасибо огромное, пригодится.
Но неужели все самые обычные операции так вот "вручную" придётся?

И кстати я нашёл в каком инклуде было "std::isspace<>" нужное для ltrim() / rtrim()...
Но его подключение почему-то портит "std::transform" из "toLower()" (на первой странице темы было)... Но ладно, фиг с ним...
Нормальных методов trim() / lower() / upper() в std этом что-то не наблюдается, наверное просто плюну и возьму API типа CharLowerW()...
13 ноя 20, 12:10    [22231337]     Ответить | Цитировать Сообщить модератору
 Re: Несколько глупых вопросов по std::string и std::wstring  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 6525
ResourceSpace
обычные операции
у тебя не обычные и кроссплатформенные.
Обычные в дельфи и пыхе
13 ноя 20, 12:21    [22231349]     Ответить | Цитировать Сообщить модератору
 Re: Несколько глупых вопросов по std::string и std::wstring  [new]
tip78
Member

Откуда: Москва
Сообщений: 1005
ResourceSpace
Dima T
Допустим в итоге так получится
L"ОднаждыВ студёную зимнюю пору,Я из лесу вышел,Был сильный мороз...  \t            ";

Это правильно?
Такие стандартные штуки как TrimLeft и TrimRight удаляет пробельные символы только с одного края:
L"Однажды\r\nВ студёную зимнюю пору,\r\nЯ из лесу вышел,\r\nБыл сильный мороз...";

Но желательно до такого вида:
L"однажды\nв студёную зимнюю пору,\nя из лесу вышел,\nбыл сильный мороз...";

как минимум, регекспом можно рубануть
ещё есть wstring.find() .rfind() .substr() .replace() .erase() и прочие
а потом ещё есть 100+ ф-й в STL

ребята третью страницу не могут понять, зачем рубать спец.символы
надо было спрашивать проще: как убрать 'a' из строки "ajfieo vaf na afj rga"?

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

Откуда: loopback
Сообщений: 49762
Dimitry Sibiryakov

mayton
А виновна система.

Валить вину на кого-то другого это так по-детски... "Я не виноват, ваза сама со стола
спрыгнула!"

Виноват один датский козёл, которому надо было выпить "капель датского короля"
еще в 20м веке или создать нормальный язык программирования с семантикой internal
string type в сам language. И сегодня велосипедят всякие там STD::, CString, TString e.t.c.
просто как следствие этого упущения.
24 ноя 20, 17:18    [22237928]     Ответить | Цитировать Сообщить модератору
 Re: Несколько глупых вопросов по std::string и std::wstring  [new]
egorych
Member

Откуда: и зачем;
Сообщений: 4809
mayton
Виноват один датский козёл, которому надо было выпить "капель датского короля"
еще в 20м веке или создать нормальный язык программирования с семантикой internal
string type в сам language. И сегодня велосипедят всякие там STD::, CString, TString e.t.c.
просто как следствие этого упущения.
а по мне так это достоинство, а не недостаток. пойди ка в вижуалбэйсике или жабе напиши свою строку попробуй)
24 ноя 20, 18:21    [22237958]     Ответить | Цитировать Сообщить модератору
 Re: Несколько глупых вопросов по std::string и std::wstring  [new]
mayton
Member

Откуда: loopback
Сообщений: 49762
Это - фундаментальная часть языка. Основа. Зачем ее переписывать? У тебя-ж не возникает
желания переписать integer ?
24 ноя 20, 18:23    [22237959]     Ответить | Цитировать Сообщить модератору
 Re: Несколько глупых вопросов по std::string и std::wstring  [new]
Basil A. Sidorov
Member

Откуда:
Сообщений: 10760
Невозможно встроить в язык все загогулистые особенности обработки строк.
Основная проблема в том, что сначала строки были массивом байт, потом решили уйти от байт, но сейчас обратно возвращаются к байтам. А всевозможные API добросовестно отражают все эти годы метаний.
24 ноя 20, 18:31    [22237961]     Ответить | Цитировать Сообщить модератору
 Re: Несколько глупых вопросов по std::string и std::wstring  [new]
Dimitry Sibiryakov
Member

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

mayton
У тебя-ж не возникает желания переписать integer ?

Довольно сложно переписать процессорный тип. А вот строки в процессоре нет - вольная воля.

Как был Си продвинутым ассемблером, так и плюсы его не изменили.

Posted via ActualForum NNTP Server 1.5

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

Откуда: Москва
Сообщений: 1005
Dimitry Sibiryakov
А вот строки в процессоре нет - вольная воля.

ascii таблица не там хранится?
пока все не станем англичанами будем грабли собирать.
24 ноя 20, 20:30    [22238011]     Ответить | Цитировать Сообщить модератору
 Re: Несколько глупых вопросов по std::string и std::wstring  [new]
Dima T
Member

Откуда:
Сообщений: 15282
tip78
Dimitry Sibiryakov
А вот строки в процессоре нет - вольная воля.

ascii таблица не там хранится?
пока все не станем англичанами будем грабли собирать.

Давно уже придуман юникод, но ascii древнее, кое-где еще живет.
24 ноя 20, 22:07    [22238029]     Ответить | Цитировать Сообщить модератору
 Re: Несколько глупых вопросов по std::string и std::wstring  [new]
Dimitry Sibiryakov
Member

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

tip78
ascii таблица не там хранится?

Ты не поверишь, но там нет даже ascii. Одни битики с байтиками в пачках разного размера.

Posted via ActualForum NNTP Server 1.5

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

Откуда: loopback
Сообщений: 49762
Отсылка к ASCII-Z строкам полезна только в том случае когда мы дёргаем функции ядра ОС
и в этому случае нам уже ну "никак не вырутиться".
24 ноя 20, 23:10    [22238056]     Ответить | Цитировать Сообщить модератору
 Re: Несколько глупых вопросов по std::string и std::wstring  [new]
Basil A. Sidorov
Member

Откуда:
Сообщений: 10760
Вот как раз ядра без особых проблем работают с UTF-8.
Именно потому, что UTF-8 полностью сохраняет семантику "массив ненулевых байт, завершаемый нулевым (байтом)".
25 ноя 20, 05:46    [22238098]     Ответить | Цитировать Сообщить модератору
 Re: Несколько глупых вопросов по std::string и std::wstring  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 6525
Dimitry Sibiryakov
mayton
У тебя-ж не возникает желания переписать integer ?

Довольно сложно переписать процессорный тип. А вот строки в процессоре нет - вольная воля.

Как был Си продвинутым ассемблером, так и плюсы его не изменили.
Причем процессор? В дельфи, java строка это класс.
25 ноя 20, 07:28    [22238107]     Ответить | Цитировать Сообщить модератору
 Re: Несколько глупых вопросов по std::string и std::wstring  [new]
tip78
Member

Откуда: Москва
Сообщений: 1005
Dima T
Давно уже придуман юникод, но ascii древнее, кое-где еще живет.

в string, как я понимаю, utf8, а в wstring - unicode ?

Сообщение было отредактировано: 25 ноя 20, 07:48
25 ноя 20, 07:46    [22238110]     Ответить | Цитировать Сообщить модератору
 Re: Несколько глупых вопросов по std::string и std::wstring  [new]
Dima T
Member

Откуда:
Сообщений: 15282
tip78
Dima T
Давно уже придуман юникод, но ascii древнее, кое-где еще живет.

в string, как я понимаю, utf8, а в wstring - unicode ?

в wstring utf16, они оба юникод

UTF - Unicode Transformation Format
25 ноя 20, 08:01    [22238116]     Ответить | Цитировать Сообщить модератору
 Re: Несколько глупых вопросов по std::string и std::wstring  [new]
tip78
Member

Откуда: Москва
Сообщений: 1005
насчёт конвертации:
// Note that the standard C++ strings have standard conversion functions that are portable:
wstring_convert<codecvt_utf8_utf16<wchar_t>, wchar_t> conversion;
wstring s = conversion.from_bytes(z.c_str());
string mbs = conversion.to_bytes(L"\u00c6\u0186");

ещё:
// http://scrutator.me/post/2013/12/29/various_literals.aspx
Литералы являются не единственным добавлением относящемся к unicode. Получение строки содержащей кодированный unicode это замечательно, но их ведь надо как-то использовать; что у нас есть для работы с unicode? А есть у нас, прямо скажем, крайне мало:

Новые фасеты для преобразования между добавленными кодировками unicode: std::codecvt_utf8<>, std::codecvt_utf16<> и std::codecvt_utf8_utf16<>
std::wstring_convert – класс для перекодирования строки в одной кодировке в другую; использует вышеупомянутые фасеты.
std::wbuffer_convert – класс для создания потокового буфера, с помощью которого можно осуществлять операции ввода\вывода с автоматическим перекодированием; использует вышеупомянутые фасеты.

// Пример:
using convertor = std::codecvt_utf8_utf16<wchar_t>;
std::string utf16ToUtf8(const std::wstring& utf16)
{
using CStr = std::string;
using CWideStr = std::wstring;
// convert UTF-8 string to wstring
CWideStr utf8_to_wstring(const CStr &str)
{
    std::wstring_convert<std::codecvt_utf8<wchar_t>> myconv;
    return myconv.from_bytes(str);
}

// convert wstring to UTF-8 string
    std::wstring_convert<convertor, wchar_t> convert;
    return convert.to_bytes(utf16.c_str());
}

std::wstring utf8ToUtf16(const std::string& utf8)
{
    std::wstring_convert<convertor, wchar_t> utf16conv;
    return utf16conv.from_bytes(utf8.c_str());
}
// В примере используется wchar_t, т.к. пример из Visual Studio где его размер 2 байта.

// Новые фасеты позволяют выполнить конвертации следующих типов:
UTF-8 &#8596; UCS-2 с использованием codecvt_utf8<char16_t> или codecvt_utf8<wchar_t> если sizeof(wchar_t) == 2;
UTF-8 &#8596; UTF-32 с использованием codecvt_utf8<char32_t> или  codecvt_utf8<wchar_t> если sizeof(wchar_t) == 4;
UTF-16 &#8596; UCS-2 с использованием codecvt_utf16<char16_t> или  codecvt_utf16<wchar_t> если sizeof(wchar_t) == 2;
UTF-16 &#8596; UTF-32 с использованием codecvt_utf16<char32_t> или  codecvt_utf16<wchar_t> если sizeof(wchar_t) == 4;
UTF-8 &#8596; UTF-16 с использованием codecvt_utf8_utf16<char16_t> или  codecvt_utf8_utf16<wchar_t> если sizeof(wchar_t) == 2;
// Список был взят отсюда: http://stackoverflow.com/questions/9476641/with-c11-do-i-still-need-a-non-standard-string-manipulation-library-for-unico

Я думаю, что не буду не прав, если скажу, что в C++ как не было поддержки unicode, так её и нет. Да эти новшества лучше чем ничего, но это никак не отменяет того, что для нормальной.
поддержки unicode в приложении нам всё равно придётся использовать ICU (http://site.icu-project.org/) и ждать, когда комитет соблаговолит добавить полноценную поддержку в язык.
Ведь в современном мире мульти-культурные приложения всегда в выигрыше, в сравнении со своими монокультурными аналогами.


Сообщение было отредактировано: 25 ноя 20, 08:30
25 ноя 20, 08:29    [22238118]     Ответить | Цитировать Сообщить модератору
 Re: Несколько глупых вопросов по std::string и std::wstring  [new]
tip78
Member

Откуда: Москва
Сообщений: 1005
говорят
автор
wchar_t следует избегать практически во всех случаях (кроме тех, когда происходит взаимодействие с Windows API).

а что будет в мультиязычных проектах, или если в какой-то либе wchar_t ?
25 ноя 20, 08:38    [22238122]     Ответить | Цитировать Сообщить модератору
 Re: Несколько глупых вопросов по std::string и std::wstring  [new]
Dima T
Member

Откуда:
Сообщений: 15282
tip78
говорят
автор
wchar_t следует избегать практически во всех случаях (кроме тех, когда происходит взаимодействие с Windows API).

а что будет в мультиязычных проектах, или если в какой-то либе wchar_t ?

Мультиязычность никак не пострадает если UTF-16 заменить на UTF-8. Одно в другое конвертируется без потерь.

Исторически сложилось что MS не как все. WinAPI (и другие продукты MS) используют UTF-16, а ПО и библиотеки других разработчиков в основном UTF-8.

Сообщение было отредактировано: 25 ноя 20, 08:39
25 ноя 20, 08:43    [22238124]     Ответить | Цитировать Сообщить модератору
 Re: Несколько глупых вопросов по std::string и std::wstring  [new]
tip78
Member

Откуда: Москва
Сообщений: 1005
забыл уточнить - речь исключительно про линух

с винды бежать надо подальше. Вот неплохая статья.
автор
Не так давно озадачился вопросом кроссплатформенной работы со строками в приложениях c++. Задача была, грубо говоря, поставлена как регистронезависимый поиск подстроки в любой кодировке на любой платформе.

Итак, первое с чем пришлось понять — что со строками в Линуксе нужно работать в кодировке UTF-8 и в типе std::string, а в Windows строки должны быть в UTF-16LE (тип std::wstring). Почему? Потому что это by design операционных систем. Хранить строки в std::wstring в Линуксе крайне накладно, поскольку один символ wchar_t занимает 4 байта (в Windows — 2 байта), а работать std::string в Windows нужно было во времена Windows 98. Для работы со строками определяем свой платформонезависимый тип:

#ifdef _WIN32
typedef std::wstring mstring;
#else
typedef std::string mstring;
#endif // _WIN32


Сообщение было отредактировано: 25 ноя 20, 08:52
25 ноя 20, 08:49    [22238125]     Ответить | Цитировать Сообщить модератору
 Re: Несколько глупых вопросов по std::string и std::wstring  [new]
Изопропил
Member

Откуда:
Сообщений: 31536
Dima T
Исторически сложилось что MS не как все. WinAPI (и другие продукты MS) используют UTF-16,

какое отношение к WINAPI имеет Java и Javascript?
25 ноя 20, 09:44    [22238151]     Ответить | Цитировать Сообщить модератору
 Re: Несколько глупых вопросов по std::string и std::wstring  [new]
Dima T
Member

Откуда:
Сообщений: 15282
Изопропил
Dima T
Исторически сложилось что MS не как все. WinAPI (и другие продукты MS) используют UTF-16,

какое отношение к WINAPI имеет Java и Javascript?

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

Откуда:
Сообщений: 6525
tip78
забыл уточнить - речь исключительно про линух
ну а тогда в чем вопрос?
Если линукс то берем std::string.
Если винда и линукс то неизбежно директива компилятору if винда... else...
25 ноя 20, 10:08    [22238165]     Ответить | Цитировать Сообщить модератору
 Re: Несколько глупых вопросов по std::string и std::wstring  [new]
Basil A. Sidorov
Member

Откуда:
Сообщений: 10760
Dima T
Исторически сложилось что MS не как все.
Уже вливается в основное русло.

К сообщению приложен файл. Размер - 8Kb
25 ноя 20, 10:11    [22238167]     Ответить | Цитировать Сообщить модератору
 Re: Несколько глупых вопросов по std::string и std::wstring  [new]
Dima T
Member

Откуда:
Сообщений: 15282
Basil A. Sidorov
Dima T
Исторически сложилось что MS не как все.
Уже вливается в основное русло.

Под капотом все-равно UTF-16 остается. Со времен Win98 (может и W95) WinAPI функция при наличии строк в параметрах имеет две версии FuncA() и FuncW(), соответственно ANSII и WideChar (UTF-16). Как утверждают в книжках в Win98 основной была FuncA(), а FuncW() просто обертка с конвертацией и вызовом FuncA(). Но начиная с Win2000 все стало с точностью до наоборот FuncW() стала основной, а FuncA() оберткой.

Не думаю что MS ядро виндовса перепишет на UTF-8, скорее всего если что и будут делать, то ограничатся комплектом оберток.
25 ноя 20, 10:23    [22238171]     Ответить | Цитировать Сообщить модератору
 Re: Несколько глупых вопросов по std::string и std::wstring  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 51774
PetroNotC Sharp
В дельфи, java строка это класс.

За Яву не скажу, но в Дельфи строка это обёртка для массива байт.

В очень старых дельфях это был массив байт с длиной в нулевом элементе.
В умеренно старых дельфях это был указатель на null-terminated массив с дополнительными полями длины и счётчика ссылок по отрицательным смещениям.
В современных дельфях это простой указатель на null-terminated массив UTF-16.

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

Откуда:
Сообщений: 6525
Dimitry Sibiryakov
PetroNotC Sharp
В дельфи, java строка это класс.

За Яву не скажу, но в Дельфи строка это обёртка для массива байт.

Главное что снаружи удобный класс.
А внутри прячем что угодно
автор
Символы со значениями, которые находятся за пределами 16-битного диапазона и в диапазоне от 0x10000 до 0x10FFFF, называются дополнительными символами и определяются как пара charзначений.

https://stackoverflow.com/questions/31206851/how-much-memory-does-a-string-use-in-java-8
https://docs.oracle.com/javase/tutorial/i18n/text/unicode.html
25 ноя 20, 13:48    [22238319]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: 1 2 3 4      [все]
Все форумы / C++ Ответить