2012-01-12 17 views
1

変数に文字列があり、その文字列はプロジェクトの中核部分から来ています。今私はユニコード文字列に変換したい。どうすればいいのですか? Lや_T()やTEXT()の追加はオプションではありません。さらにあなたは "Unicodeに変換" と言うことはできませんCで文字列をUnicodeに変換する

Void foo(char* string) { 
    //Here the contents of the variable STRING should be converted to Unicode 
    //The soln should be possible to use in C code. 
} 

TIA のNaveen

+4

どのプラットフォームですか?または、移植可能なユニコードライブラリが必要ですか?そして、「ユニコード」はどういう意味ですか?あなたはUTF-16を意味しますか?文字列はすでにどの形式ですか?それが純粋なASCIIなら何もすることはありません。ASCIIはUnicodeのサブセットなので、ASCIIの場合はUnicodeです。 –

+0

私はSafeArrayPutElementを使用しています。私の場合、3番目のパラメータはvoid *ですが、文字列を渡したいので、char * string APIに直接渡すと記憶がないと言っても失敗する。私は(L "ChkIt")を使用する場合、テストの目的のためにうまく動作します。文字列変数TIA – Naveen

+0

の内容を 'L'(ユニコードに変換)する方法は、狭い文字をワイド文字に変換したいのですか? – tripleee

答えて

1

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に変換するためにこれらのメソッドを試した場合、エラーは他の場所にあります。おそらくあなたのストリングの実際の内容です。おそらく、正しくヌル終了していないのでしょうか?

+0

こんにちは、Bames、答えてくれてありがとうございます。 – Naveen

0

下記参照してくださいことを明確にする 。 符号化を指定する必要があります。Unicodeはエンコードではありませんが、大まかにキャラクタセットであり、これらの文字を一連のバイトとして表現するためのエンコードセットです。

また、入力エンコードを指定する必要があります。 stringにコード化された "å"のような文字?

関連する問題