5

C++ ビルダーで UnicodeString を UTF-8 でエンコードされた文字列に変換しようとしています。そのために UnicodeToUtf8() 関数を使用します。

char * dest;
UnicodeSring src;
UnicodeToUtf8(dest,256,src.w_str(),src.Length());

しかし、コンパイラはランタイム アクセス違反メッセージを表示します。私が間違っていることは何ですか?

4

2 に答える 2

10

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...
于 2013-02-02T06:56:48.463 に答える
4

これにより、質問の問題が修正されますが、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 );
于 2013-02-01T18:14:45.880 に答える