Я разрабатываю для 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;
}
Самый простой подход — сначала объявить строку иначе:
std::wstring myString;
myString = L"Another text";
Если вы настаиваете на использовании массивов wchar_t
напрямую, вы бы использовали wcscpy()
или лучше wcsncpy()
от <cwchar>
:
wchar_t myString[1024];
std::wcsncpy(myString, L"Another text", 1024);
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);