web-dev-qa-db-ja.com

wchar_tを宣言し、後でその文字列値を設定するにはどうすればよいですか?

私はWindows用に開発していますが、正しく宣言し、後でUnicode文字列を設定する方法に関する十分な情報が見つかりませんでした。これまでのところ、

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

上記で私が仮定すると、[1024]は、その文字列に最大である必要がある文字数の割り当てられた文字列の長さです。 L ""は、引用符で囲まれた文字列がユニコードであることを確認します(私が見つけたaltは_T()です)。後でプログラムでその文字列を別の値に設定しようとすると、

myString = L"Another text";

コンパイラエラーが発生しますが、何が間違っていますか?

また、誰かが簡単で詳細なUnicodeアプリリソースを持っている場合は、いくつかのリンクが必要です。以前はその専用のWebサイトをブックマークしていましたが、現在はなくなっているようです。

[〜#〜]編集[〜#〜]

コード全体を提供します。これを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
user780756

最も簡単なアプローチは、最初に文字列を別の方法で宣言することです。

_std::wstring myString;
myString = L"Another text";
_

_wchar_t_の配列を直接使用する場合は、_<cwchar>_からwcscpy()以上のwcsncpy()を使用します。

_wchar_t myString[1024];
std::wcsncpy(myString, L"Another text", 1024);
_
5
Dietmar Kühl
wchar_t myString[1024] = L"My Test Unicode String!";

のように配列を初期化しています

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

だが

myString = L"Another text";

uが配列に対して実行できない割り当てです。新しい文字列の内容を古い配列にコピーする必要があります。

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);

またはnawazがcopy_nで提案したように

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