Как объявить wchar_t и установить его строковое значение позже?

Я разрабатываю для Windows, я не нашел адекватной информации о том, как правильно объявить, а затем установить строку Unicode. До сих пор,

wchar_t myString[1024] = L"My Test Unicode String!";

Что я предполагать выше указано [1024] — это длина выделенной строки, сколько символов мне нужно иметь максимум в этой строке. L «» гарантирует, что строка в кавычках — это Unicode (альт, который я нашел, это _T ()). Позже в моей программе, когда я пытаюсь установить для этой строки другое значение,

myString = L"Another text";

Я получаю ошибки компилятора, что я делаю не так?

Также, если у кого-то есть простой и всесторонний ресурс по юникодному приложению, я бы хотел иметь несколько ссылок, которые раньше делали закладки на веб-сайте, который был посвящен этому, но, кажется, что его уже нет.

РЕДАКТИРОВАТЬ

Я предоставляю весь код, я намерен использовать это как функцию DLL, но пока ничего не возвращается.

#include "dll.h"#include <windows.h>
#include <string>
#include <cwchar>

export LPCSTR ex_test()
{
wchar_t myUString[1024];
std::wcsncpy(myUString, L"Another text", 1024);

int myUStringLength = lstrlenW(myUString);

MessageBoxW(NULL, (LPCWSTR)myUString, L"Test", MB_OK);

int bufferLength = WideCharToMultiByte(CP_UTF8, 0, myUString, myUStringLength, NULL, 0, NULL, NULL);
if (bufferLength <= 0) { return NULL; } //ERROR in WideCharToMultiByte
return NULL;

char *buffer = new char[bufferLength+1];
bufferLength = WideCharToMultiByte(CP_UTF8, 0, myUString, myUStringLength, buffer, bufferLength, NULL, NULL);
if (bufferLength <= 0) { delete[] buffer; return NULL; } //ERROR in WideCharToMultiByte

buffer[bufferLength] = 0;

return buffer;
}

8

Решение

Самый простой подход — сначала объявить строку иначе:

std::wstring myString;
myString = L"Another text";

Если вы настаиваете на использовании массивов wchar_t напрямую, вы бы использовали wcscpy() или лучше wcsncpy() от <cwchar>:

wchar_t myString[1024];
std::wcsncpy(myString, L"Another text", 1024);
5

Другие решения

wchar_t myString[1024] = L"My Test Unicode String!";

инициализирует массив как

wchar_t myString[1024] = { 'M', 'y', ' ', ..., 'n', 'g', '\0' };

но

myString = L"Another text";

это присвоение, которое вы не можете сделать с массивами. вам нужно скопировать содержимое новой строки в ваш старый массив:

const auto& newstring = L"Another text";
std::copy(std::begin(newstring), std::end(newstring), myString);

или если его указатель

wchar_t* newstring = L"Another text";
std::copy(newstring, newstring + wsclen(newstring) + 1, myString);

или как наваз предложил с copy_n

std::copy_n(newstring, wsclen(newstring) + 1, myString);
3

По вопросам рекламы [email protected]