C++ ビルダーで UnicodeString を UTF-8 でエンコードされた文字列に変換しようとしています。そのために UnicodeToUtf8() 関数を使用します。
char * dest;
UnicodeSring src;
UnicodeToUtf8(dest,256,src.w_str(),src.Length());
しかし、コンパイラはランタイム アクセス違反メッセージを表示します。私が間違っていることは何ですか?
C++ ビルダーで UnicodeString を UTF-8 でエンコードされた文字列に変換しようとしています。そのために UnicodeToUtf8() 関数を使用します。
char * dest;
UnicodeSring src;
UnicodeToUtf8(dest,256,src.w_str(),src.Length());
しかし、コンパイラはランタイム アクセス違反メッセージを表示します。私が間違っていることは何ですか?
C++Builder 2009 以降を使用していて (あなたは言いませんでした)、RTL のSystem::UnicodeString
クラス (他のサードパーティUnicodeString
クラスではない) を使用していると仮定すると、この状況を処理するためのより簡単な方法があります。C++Builder にもSystem::UTF8String
利用可能なクラスがあります (C++Builder 6 以降で利用可能ですが、C++Builder 2009 まで真の RTL 実装の UTF-8 文字列型にはなりませんでした)。UnicodeString
を aに割り当てるだけUTF8String
で、RTL にメモリ割り当てとデータ変換を処理させます。たとえば、次のようになります。
UnicodeString src = ...;
UTF8String dest = src; // <-- automatic UTF16-to-UTF8 conversion
// use dest.c_str() and dest.Length() as needed...
これにより、質問の問題が修正されますが、UTF16 から UTF8 への変換を行う実際の方法は、以下の Remy の回答にあります。
dest は、初期化しないため、メモリ内のランダム空間へのポインターです。デバッグ ビルドではおそらく 0 を指しますが、リリース ビルドではどこにでもある可能性があります。UnicodeToUtf8 に、 dest が 256 文字の余地があるバッファーであることを伝えています。
これを試して
char dest[256]; // room for 256 characters
UnicodeString src = L"Test this";
UnicodeToUtf8( dest, 256, src, src.Length() );
しかし実際には、より簡単に使用できます。
char dest[256]; // room for 256 characters
UnicodeString src = L"Test this";
UnicodeToUtf8( dest, src, 256 );