Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
-23 / 4 / 0
Регистрация: 15.08.2014
Сообщений: 492

Как правильно преобразовать массив char в wstring ?

07.09.2025, 17:13. Показов 3359. Ответов 51
Метки нет (Все метки)

Добрый вечер!

Мне необходимо преобразовать массив char в wstring. Нашел пример - см. далее.

Вопрос1:
Насколько он корректен ?
Насколько я понял, std::codecvt_utf8 указывает, что исходный массив - в utf8, т.е. может быть более 1 байта на 1 символ.
Мой исходный массив - точно 1 байт на символ.

Соответственно, я буду использовать другой вариант - он далее.
Вопрос2 по нему:
есть ли вариант обойтись без промежуточной WTemp, чтобы записать результат сразу в wout ?


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
// --- пример ---
#include <iostream>
#include <string>
#include <locale>
#include <codecvt>
 
int main() {
    // Example std::string
    std::string narrowStr = "Hello, world!";
 
    // Convert std::string to std::wstring
    std::wstring_convert<std::codecvt_utf8<wchar_t>> converter;
    std::wstring wideStr = converter.from_bytes(narrowStr);
 
    // Print results
    std::wcout << L"Wide string: " << wideStr << std::endl;
 
    return 0;
}
 
 
// мой вариант
 
bool ConvertFromStringToWstring(const char* in_StringBufPtr, int in_StringBufSize, std::wstring& wout) {
    // Преобразует строку одно байтных символов in_StringBufPtr:in_StringBufSize 
    // в строку wstring (wout).
    if ((in_StringBufPtr == nullptr) || (in_StringBufSize < 0))
        return false;
 
    wout.clear();
 
    if (in_StringBufSize == 0)
        return true;
 
    static_assert(sizeof(in_StringBufPtr[0]) == 1, "Chars array only is allowed!");
 
    std::wstring WTemp(in_StringBufPtr, in_StringBufPtr + in_StringBufSize);
    wout = std::move(WTemp);
 
    return true;
}
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
07.09.2025, 17:13
Ответы с готовыми решениями:

Ошибка: "char *concat(char *,.)": невозможно преобразовать аргумент 1 из "const char [4]" в "char *"
делал задание, но на строке 36 строке пишет, что &quot;char *concat(char *,...)&quot;: невозможно...

Объясните, что означает wstring input = L""; и wstring output = L""; ?
Непонятно особенно L&quot;&quot;.

Конвертация wstring в TCHAR* ( или wstring в FString(ue4)
Есть записанный русский текст в переменную типа std::wstring, нужно перевести эту строку в...

51
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
08.09.2025, 22:19
Цитата Сообщение от LUN2 Посмотреть сообщение
использует часть1 кода, которую необходимо, переделать из string в wstring, поскольку
она должна наконец-таки нормально воспринимать русские буквы.
Так для любых символов вне диапазона 128 символов такая конвертация копированием непригодна.
Я уже об этом писал.

Добавлено через 39 секунд
Кажется что писал)
0
-23 / 4 / 0
Регистрация: 15.08.2014
Сообщений: 492
08.09.2025, 23:18  [ТС]
Цитата Сообщение от SmallEvil Посмотреть сообщение
Цитата Сообщение от LUN2 Посмотреть сообщение
использует часть1 кода, которую необходимо, переделать из string в wstring, поскольку
она должна наконец-таки нормально воспринимать русские буквы.
Так для любых символов вне диапазона 128 символов такая конвертация копированием непригодна.
Я уже об этом писал.
SmallEvil, тоже не хочу пересматривать диалог, но подразумевается, что та часть2, которая остается в первозданном варианте со string, использует только символы 0-127.
Именно потому она и не переделывается в wstring, а используется упрощенный вариант - копирование в wstring
или присоединение к wstring.
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6279 / 3003 / 1051
Регистрация: 01.06.2021
Сообщений: 11,249
08.09.2025, 23:21
Цитата Сообщение от LUN2 Посмотреть сообщение
Есть готовые библиотеки (я просто не знаю) ?
в любом нормальном фреймворке есть функции для работы со строками без головной боли
Цитата Сообщение от LUN2 Посмотреть сообщение
Мне кроссплатформенность (как минимум, в ближайшее время) не нужна - только Win и Visual Studio
если не будешь использовать фреймворки и кроссплатформенность не нужна, тогда можешь и дальше использовать свой wstring, тем более, что винапи тоже любит wchar_t, там он называется WCHAR. Там еще используются LPWSTR (wchar_t*), LPCWSTR (const wchar_t*). Сам WinAPI прямо не использует wstring, но раз там для Unicode используется wchar_t, то wstring будет там удобен.
LPCWSTR можно будет получить из wstring, просто вызвав c_str().
0
358 / 120 / 8
Регистрация: 19.07.2024
Сообщений: 627
09.09.2025, 03:03
Цитата Сообщение от Royal_X Посмотреть сообщение
в utf8 один символ занимает 1, 2, 3 или 4 байта. Кириллица будет занимать 2.
Даже в чисто кириллическом тексте могут быть знаки препинания, цифры и т.п. знаки. А значит по такому тексту будет сложнее индексироваться. Уж не говоря о том, что может быть нужно работать с текстами на разных языках. В 2-байтовые же символы обычно влазит всё что нужно. Поэтому они удобны в практической работе.
UTF-8 конечно универсальнее, но и сложнее, неудобнее.
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
09.09.2025, 11:51
jcxz, двухбайтовой строке, как ни крути, но тоже будет utf-16, с суррогатными парами.
В самом простом случае:
wstring str = L"Какой то текст."; // юникодная строка будет преобразована в utf-16
Со всеми вытекающими.
То есть, при толковой работе с текстом на различных языках, двухбайтовые строки - такой же геморой как и однобайтовые.
А для прикладных оконных приложений, вполне может хватит и utf8 строк, при этом не ограничивая себя нигде.

Всё зависит только от конкретных задач и обстоятельств.
О сферических конях можно до бесконечности слюни пускать.
0
358 / 120 / 8
Регистрация: 19.07.2024
Сообщений: 627
09.09.2025, 13:15
Цитата Сообщение от SmallEvil Посмотреть сообщение
при толковой работе с текстом на различных языках, двухбайтовые строки - такой же геморой как и однобайтовые.
Почему? В чём "геморрой"?
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
09.09.2025, 13:45
Цитата Сообщение от jcxz Посмотреть сообщение
Почему? В чём "геморрой"?
Цитата Сообщение от jcxz Посмотреть сообщение
А значит по такому тексту будет сложнее индексироваться.
Точно такой же как и с utf8 строками.
Цитата Сообщение от jcxz Посмотреть сообщение
В 2-байтовые же символы обычно влазит всё что нужно.
Любая строка или файл загруженный в такую строку содержащий хоть один символ выше двухбайтного представления в UTF-16, будет считаться не валидной в такой программе.
Детский сад.

То есть, это подход: "А, и так сойдет.".
Ну если так и сойдет, ну что ж, значит всё хорошо)
0
358 / 120 / 8
Регистрация: 19.07.2024
Сообщений: 627
09.09.2025, 14:02
Цитата Сообщение от SmallEvil Посмотреть сообщение
Точно такой же как и с utf8 строками.
И в чём именно сложность в индексировании в символах фиксированного размера (UTF-16)?
Цитата Сообщение от SmallEvil Посмотреть сообщение
Любая строка или файл загруженный в такую строку содержащий хоть один символ выше двухбайтного представления в UTF-16, будет считаться не валидной в такой программе.
А зачем "грузить файл в такую строку"? Тем более - не глядя. А если в программе не нужна ни какая "загрузка файлов в строку"?

Цитата Сообщение от SmallEvil Посмотреть сообщение
Детский сад.
То есть, это подход: "А, и так сойдет.".
"Детский сад" и "так сойдёт" - это грузить не глядя бинарный файл в строку. Без парсинга.
Цитата Сообщение от SmallEvil Посмотреть сообщение
Ну если так и сойдет, ну что ж, значит всё хорошо)
По существу есть что сказать?
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
09.09.2025, 14:14
Цитата Сообщение от jcxz Посмотреть сообщение
И в чём именно сложность в индексировании в символах фиксированного размера (UTF-16)?
Займись самообразованием и не неси ерунды!
Данная кодировка позволяет записывать символы Юникода в диапазонах U+0000..U+D7FF и U+E000..U+10FFFF (общим количеством 1 112 064). При этом каждый символ записывается одним или двумя словами (последнее называется суррогатная пара). Кодировка UTF-16 описана в приложении Q к международному стандарту ISO/IEC 10646, а также ей посвящён IETF RFC 2781 «UTF-16, an encoding of ISO 10646».
0
358 / 120 / 8
Регистрация: 19.07.2024
Сообщений: 627
09.09.2025, 14:16
Цитата Сообщение от SmallEvil Посмотреть сообщение
Данная кодировка позволяет записывать символы Юникода в диапазонах U+0000..U+D7FF и U+E000..U+10FFFF (общим количеством 1 112 064). При этом каждый символ записывается одним или двумя словами (последнее называется суррогатная пара). Кодировка UTF-16 описана в приложении Q к международному стандарту ISO/IEC 10646, а также ей посвящён IETF RFC 2781 «UTF-16, an encoding of ISO 10646».
Ликбез-ом займись.
И что? Функционал любой программы задаётся в ТЗ. Слышали про такое понятие?
Если в ТЗ не сказано ни про какие "загрузки файлов" куда-бы то ни было, ни про какие-либо "комплементарные пары", а нужно скажем: "Обеспечить интерактивный интерфейс с пользователем на нескольких (перечисленных) европейских языках" (иероглифы - не нужны). То почему в такой задаче не использовать исключительно 2-байтные символы UTF-16?
Зачем тут полный набор UTF-8?

Добавлено через 1 минуту
Цитата Сообщение от SmallEvil Посмотреть сообщение
Займись самообразованием и не неси ерунды!
Примените это к себе.
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
09.09.2025, 14:19
Цитата Сообщение от jcxz Посмотреть сообщение
То почему в такой задаче не использовать UTF-16?
Можно использовать всё что удовлетворяет потребности в решении задачи.
Но разговор то был не об этом.
Разговор о сферических конях и почему utf16 - лучше utf8.
Плюсы и минусы - очевидны.
И я уже давно сказал что выбор ведется от задачи, а не просто какие то размышления вслух:
Цитата Сообщение от jcxz Посмотреть сообщение
Даже в чисто кириллическом тексте могут быть знаки препинания, цифры и т.п. знаки. А значит по такому тексту будет сложнее индексироваться. Уж не говоря о том, что может быть нужно работать с текстами на разных языках. В 2-байтовые же символы обычно влазит всё что нужно. Поэтому они удобны в практической работе.
UTF-8 конечно универсальнее, но и сложнее, неудобнее.
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6279 / 3003 / 1051
Регистрация: 01.06.2021
Сообщений: 11,249
09.09.2025, 15:25
ТС был удовлетворен ответом SmallEvil, так что не вижу смысла в продолжении дискуссии. Честно говоря, наверное, дискуссия отклонилась в сторону из-за меня. Но я лишь хотел объяснить ТС, что раз ему нужна кириллица, это не означает, что string не подходит. Выше я по этому поводу уже дал разъяснение.
У каждой кодировки есть преимущества и недостатки. Самое главное, сделать так, чтобы потом приложение правильно отображало текст не только на винде с кириллической кодировкой, но и на "некириллических" системах.
0
Нарушитель
622 / 380 / 67
Регистрация: 09.03.2016
Сообщений: 4,165
09.09.2025, 15:52
Цитата Сообщение от Royal_X Посмотреть сообщение
wstring будет там удобен.
Я на нём однажды мандавошек наловил. С тех пор не использую.
Надо грамотно работать на wchar_t, понимая процесс. Понимая что ты делаешь.
А ещё лучше на char. Не знаю как где,
а на msvs присутствует полный набор функций под широкие и узкие строки.
0
Нарушитель
622 / 380 / 67
Регистрация: 09.03.2016
Сообщений: 4,165
09.09.2025, 16:09
C++
1
2
3
4
5
6
7
8
9
char d_t[25]{};// Строка в которой будет дата Т.Е только цифры... Не надо её делать широкой. Это только цифры.
char *cut_ptr = &line[0];
                if (*(cut_ptr + 4) == '-' && *(cut_ptr + 35) == '.' && *(cut_ptr + 40) == '0' && *(cut_ptr + 43) == ' ')
                {//Определяем строчку с датой с начала строки
                    memset(d_t, 0, 25);
                    for (int i = 33; i < 43; ++i)strncat(d_t, (const char*)cut_ptr + i, 1);
                    strncat(d_t, " ", 1);
                    ++num;// Строчки считает....
                }

Вот преобразование в широкие символы. У себя нашёл.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
if (repeat) {// Строка с таким адресом встречалась раньше (Добавим перед адресом пометку <next>)
                   wchar_t date[25]{}; // Это строка wchar_t, в неё сначала цифры, потом остальное. (Остальное это wchar_t)
                                if (eqal != 0 && len_of != 0)
                                {
                                    mbstowcs(&date[0], d_t, len_of + 1);
                                    swprintf(sample, L"%s%s%s", date, L" <next>", buf_ptr);
                                }
                                else swprintf(sample, L"%s%s", L" <next>", buf_ptr);
                            }
                            else {// Не встречалась
                                if (eqal != 0 && len_of != 0)
                                {
                                    mbstowcs(&date[0], d_t, len_of + 1);
                                    swprintf(sample, L"%s%s", date, buf_ptr);
                                }
                                else swprintf(sample, L"%s%s", L"   ", buf_ptr);
                            }
0
Нарушитель
622 / 380 / 67
Регистрация: 09.03.2016
Сообщений: 4,165
09.09.2025, 16:10
0
Нарушитель
622 / 380 / 67
Регистрация: 09.03.2016
Сообщений: 4,165
09.09.2025, 16:19
У мня в кодах всего хватает. Я только не всё помню...
Но если оно работает, то оно работает.
Я это гуглил всё сам... Тогда ещё не было ИИ.
Я там в коментах добавил примерно...
А wchar_t to wstring это ------------ wstring target(wchar_t указатель.);
Можно было конечно просто цифры покопировать, но.... мандавошек боюсь..
0
2736 / 891 / 331
Регистрация: 10.02.2018
Сообщений: 2,128
09.09.2025, 16:24
Наталья8, проблема этих функций в том, что они завязаны на локаль (setlocale). Локаль - штука глобальная. Её изменение может вылезти боком в каком-нибудь другом месте. Например, при преобразовании float в строку точка может "вдруг" замениться на запятую.
1
Нарушитель
622 / 380 / 67
Регистрация: 09.03.2016
Сообщений: 4,165
09.09.2025, 16:29
Цитата Сообщение от Ygg Посмотреть сообщение
этих функций в том
Каких этих.... Может быть... У меня работает на моём компьютере. У меня одна локаль..
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6279 / 3003 / 1051
Регистрация: 01.06.2021
Сообщений: 11,249
09.09.2025, 17:45
Наталья8, чтобы работало на твоём компе достаточно слепить методом тыка из говна и палок. Нормальное приложение должно у других тоже работать.
0
358 / 120 / 8
Регистрация: 19.07.2024
Сообщений: 627
09.09.2025, 18:52
Цитата Сообщение от Royal_X Посмотреть сообщение
ТС был удовлетворен ответом SmallEvil, так что не вижу смысла в продолжении дискуссии.
Если внимательно почитать тему, то можно заметить, что ТС был удовлетворён гораздо ранее "ответа SmallEvil". И соответственно - вся последующая дискуссия (вместе с ответом SmallEvil) уже была не нужна.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
09.09.2025, 18:52

преобразовать std::wstring в char []
добрый день. подскажите ,пожалуйста как быстро можно перевести переменную типа std::wstring в char...

Как переменной wstring присвоить значение char*?
Вот фрагмент кода std::wstring strarg1 = args-&gt;args; std::wstring strarg2 = args-&gt;args;...

По поводу wchar_t, wstring, char, string и кодировок
Здравствуйте, пишу консольную либу которая будет работать с большим количеством символов в разных...

wchar_t* в char* (string to wstring) преобразования неправильно работают
Есть функции, которые конвертируют string to wstring(и наоборот). Написаны тесты, два последних не...

Как преобразовать строку URI в wstring
Добрый вечер! Программа на javascript будет запрашивать у пользователя имя файла, кодировать его в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
[golang] Worker Pool
alhaos 09.06.2026
Worker Pool Worker Pool — паттерн конкурентной обработки задач в Go. Суть: фиксированное количество горутин-воркеров читают задачи из общего канала и пишут результаты в общий канал результатов. . . .
[golang] Pipeline
alhaos 08.06.2026
Pipeline Pipeline — паттерн конкурентной обработки данных в Go. Суть: данные проходят через цепочку независимых стадий, каждая из которых работает в своей горутине и общается с соседями через. . .
Свет внутри себя
kumehtar 07.06.2026
Пусть это будет здесь lIs4oanZS9Y
Программа для com-порта
Uhbif79 05.06.2026
Всем привет, давно хотел изучить Qt, начинал, бросал, потом снова начинал. И сейчас вот смог написать свою первую программу. До этого имел опыт программирования микроконтроллеров, писал прошивки на. . .
Транскрипция 55-минутного видео через Whisper: WhisperDesktop облажался, спас Google Colab[
anaschu 01.06.2026
Понадобилось получить текст из свежезагруженного видео на YouTube. Казалось бы, задача на пять минут. Заняла полтора часа. Делюсь опытом — может кому пригодится последовательность решений. . . .
21 мат мед. Планы на развитие модели здравоСохранения
anaschu 01.06.2026
AnyLogic: план развития симуляционной модели рабочего коллектива — динамический абсентеизм, реальные данные, три сценария сравнения Продолжаю серию постов о дискретно-событийной модели рабочего. . .
20. Мат мед. Абсентеизм как отдельный тип простоя
anaschu 29.05.2026
Апдейт модели: исправленные баги, абсентеизм и новые механизмы Продолжаю развивать ранее описанную модель рабочего коллектива на AnyLogic. За последние несколько дней был проведён серьёзный. . .
19. здоровье, усталость и психотип работника влияют на производительность предприятия, и наоборот, производительность на здоровье, усталось и психотип
anaschu 28.05.2026
Дискретно-событийная модель рабочего коллектива на AnyLogic: здоровье, выгорание, психотипы и микростимуляция Привет, коллеги. Хочу поделиться итогами нескольких недель работы над симуляционной. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru