Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to declare wchar_t and set its string value later on?

I am developing for Windows, I have not found adequate information on how to correctly declare and later on set a unicode string. So far,

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

What I assume the above does is [1024] is the allocated string length of how many characters I need to have max in that string. L"" makes sure the string in quotes is unicode (An alt I found is _T()). Now later on in my program when I am trying to set that string to another value by,

myString = L"Another text";

I get compiler errors, what am I doing wrong?

Also if anyone has an easy and in-depth unicode app resource I'd like to have some links, used to have bookmarked a website which was dedicated to that but seems that now is gone.

EDIT

I provide the entire code, I intend to use this as a DLL function but nothing so far is returned.

#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;
}
like image 243
user780756 Avatar asked Sep 28 '13 19:09

user780756


2 Answers

The easiest approach is to declare the string differently in the first place:

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

If you insist in using arrays of wchar_t directly, you'd use wcscpy() or better wcsncpy() from <cwchar>:

wchar_t myString[1024];
std::wcsncpy(myString, L"Another text", 1024);
like image 93
Dietmar Kühl Avatar answered Oct 08 '22 16:10

Dietmar Kühl


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

is initializing the array like this

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

but

myString = L"Another text";

is an assignment which u cannot do to arrays. u have to copy the contents of the new string into your old array:

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

or if its a pointer

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

or as nawaz suggested with copy_n

std::copy_n(newstring, wsclen(newstring) + 1, myString);
like image 26
Kal Avatar answered Oct 08 '22 14:10

Kal