web-dev-qa-db-ja.com

char *をLPWSTRに変換

マルチバイト文字のプログラムをユニコードに変換しようとしています。

プログラムを実行し、文字列リテラルの前にLを付けたので、L"string"のように見えます。

これは機能しましたが、私は適合しないCスタイルの文字列を残しています。 Lを試してTEXT()に入れましたが、TEXT()を使用すると、Lが文字列ではなく変数名に追加されます。

私はそれをTCHARにしようとしましたが、それはTCHARchar *に変換できないと文句を言います。

どのオプションが残っていますか?

私はCとC++が異なることを知っています。これは、数年前からC++プロジェクトで使用されている古い社内Cライブラリです。

33
Skeith

std::mbstowcs 関数はあなたが探しているものです:

 char text[] = "something";
 wchar_t wtext[20];
 mbstowcs(wtext, text, strlen(text)+1);//Plus null
 LPWSTR ptr = wtext;

stringsの場合、

 string text = "something";
 wchar_t wtext[20];
 mbstowcs(wtext, text.c_str(), text.length());//includes null
 LPWSTR ptr = wtext;

-> ED:「L」プレフィックスは、文字列リテラルでのみ機能し、変数では機能しません。 <-

41
Raphael R.

mbstowcsを使用するクリーンな方法は、それを2回呼び出して結果の長さを見つけることです。

_  const char * cs = <your input char*>
  size_t wn = mbsrtowcs(NULL, &cs, 0, NULL);

  // error if wn == size_t(-1)

  wchar_t * buf = new wchar_t[wn + 1]();  // value-initialize to 0 (see below)

  wn = mbsrtowcs(buf, &cs, wn + 1, NULL);

  // error if wn == size_t(-1)

  assert(cs == NULL); // successful conversion

  // result now in buf, return e.g. as std::wstring

  delete[] buf;
_

プログラムの最初でsetlocale(LC_CTYPE, "");を呼び出すことを忘れないでください!

Windows MultiByteToWideCharに対する利点は、これが完全に標準Cであるということです。Windowsでは、とにかくWindows API関数を好むかもしれません。

通常、このメソッドは、反対のメソッドとともに、2つの変換関数string-> wstringおよびwstring-> stringでラップします。簡単なオーバーロードstring-> stringおよびwstring-> wstringも追加する場合、Winapi TCHAR任意の設定でtypedef。

[Edit:] C配列を直接使用する場合に備えて、bufにゼロ初期化を追加しました。ただし、通常は結果をstd::wstring(buf, wn)として返しますが、Cスタイルのヌル終了配列を使用する場合は注意してください。[/]

マルチスレッド環境では、スレッドローカル変換状態を最終(現在は非表示)パラメーターとして関数に渡す必要があります。

このトピックに関する私の 小暴言 を次に示します。

12
Kerrek SB

このバージョンは、Windows API関数MultiByteToWideChar()を使用して、任意の長い入力文字列のメモリ割り当てを処理します。

int lenA = lstrlenA(input);
int lenW = ::MultiByteToWideChar(CP_ACP, 0, input, lenA, NULL, 0);
if (lenW>0)
{
    output = new wchar_t[lenW];
    ::MultiByteToWideChar(CP_ACP, 0, input, lenA, output, lenW);
} 
4
David Heffernan

CStringCStringACStringWを使用して、自動変換を行い、これらの型の間で変換することができます。さらに、CStrBufCStrBufACStrBufWを使用して、RAIIパターンの変更可能な文字列を取得することもできます。

1
Ajay

私はVC++で次のものを使用していますが、それは私にとって魅力のように機能します。

CA2CT(charText)
0
MoraRockey