マルチバイト文字のプログラムをユニコードに変換しようとしています。
プログラムを実行し、文字列リテラルの前にL
を付けたので、L"string"
のように見えます。
これは機能しましたが、私は適合しないCスタイルの文字列を残しています。 L
を試してTEXT()
に入れましたが、TEXT()
を使用すると、L
が文字列ではなく変数名に追加されます。
私はそれをTCHAR
にしようとしましたが、それはTCHAR
をchar *
に変換できないと文句を言います。
どのオプションが残っていますか?
私はCとC++が異なることを知っています。これは、数年前からC++プロジェクトで使用されている古い社内Cライブラリです。
std::mbstowcs
関数はあなたが探しているものです:
char text[] = "something";
wchar_t wtext[20];
mbstowcs(wtext, text, strlen(text)+1);//Plus null
LPWSTR ptr = wtext;
string
sの場合、
string text = "something";
wchar_t wtext[20];
mbstowcs(wtext, text.c_str(), text.length());//includes null
LPWSTR ptr = wtext;
-> ED:「L」プレフィックスは、文字列リテラルでのみ機能し、変数では機能しません。 <-
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スタイルのヌル終了配列を使用する場合は注意してください。[/]
マルチスレッド環境では、スレッドローカル変換状態を最終(現在は非表示)パラメーターとして関数に渡す必要があります。
このトピックに関する私の 小暴言 を次に示します。
このバージョンは、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);
}
CString
、CStringA
、CStringW
を使用して、自動変換を行い、これらの型の間で変換することができます。さらに、CStrBuf
、CStrBufA
、CStrBufW
を使用して、RAIIパターンの変更可能な文字列を取得することもできます。
私はVC++で次のものを使用していますが、それは私にとって魅力のように機能します。
CA2CT(charText)