L
は、wchar_tリテラルの作成に使用されます。
SafeArrayPutElement
についてのあなたのコメントと私たちの言葉である「Unicode」からは、あなたがWindowsを使用していることは明らかです。そのchar* string
は、Windowsは、あなたが次の方法でのwchar_t文字列を取得することができUTF-8か何か(Windows上で安全な仮定)を使用していないレガシーエンコーディングであると仮定すると:
// typical Win32 conversion in C
int output_size = MultiByteToWideChar(CP_ACP,0,string,-1,NULL,0);
wchar *wstring = malloc(output_size * sizeof(wchar_t));
int size = MultiByteToWideChar(CP_ACP,0,string,-1,wstring,output_size);
assert(output_size==size);
// make use of wstring here
free(wstring);
あなたがCを使用している場合++ここで
std::wstring ws(output_size,L'\0');
int size = MultiByteToWideChar(CP_ACP,0,string,-1,ws.data(),ws.size());
// MultiByteToWideChar tacks on a null character to mark the end of the string, but this isn't needed when using std::wstring.
ws.resize(ws.size() -1);
// make use of ws here. You can pass a wchar_t pointer to a function by using ws.c_str()
//std::wstring handles freeing the memory so no need to clean up
は、より多くのを使用する別の方法です:あなたがのstd ::代わりにwstringのを使用して、安全なその例外を作りたいかもしれません(これは、上記のVS2010かが必要な場合がありますので、C++ 11の小さなビットを使用して) C++の標準ライブラリ(VS2010が完全に標準に準拠していないことを利用):
#include <locale> // for wstring_convert and codecvt
std::wstring ws = std::wstring_convert<std::codecvt<wchar_t,char,std::mbstate_t>,wchar_t>().from_bytes(string);
// use ws.c_str() as before
また、wchar_tに変換しようとしたときに同じエラーが発生したというコメントが含まれています。これがwchar_tに変換するためにこれらのメソッドを試した場合、エラーは他の場所にあります。おそらくあなたのストリングの実際の内容です。おそらく、正しくヌル終了していないのでしょうか?
どのプラットフォームですか?または、移植可能なユニコードライブラリが必要ですか?そして、「ユニコード」はどういう意味ですか?あなたはUTF-16を意味しますか?文字列はすでにどの形式ですか?それが純粋なASCIIなら何もすることはありません。ASCIIはUnicodeのサブセットなので、ASCIIの場合はUnicodeです。 –
私はSafeArrayPutElementを使用しています。私の場合、3番目のパラメータはvoid *ですが、文字列を渡したいので、char * string APIに直接渡すと記憶がないと言っても失敗する。私は(L "ChkIt")を使用する場合、テストの目的のためにうまく動作します。文字列変数TIA – Naveen
の内容を 'L'(ユニコードに変換)する方法は、狭い文字をワイド文字に変換したいのですか? – tripleee