0

私は現在、C++ でアプリケーションに取り組んでおり、それは Lua に結び付けられ、Flash に (この順序で) 結び付けられます。現時点での私の目標は、wchar_tLua を介して C++ から Flash に s を取得することです。どうすればこれを達成できるかについての洞察が欲しいです!

その他の情報が必要な場合は、お問い合わせください。提供できるよう最善を尽くします。


私が試したこと

Lua が Unicode のファンではないことは理解していますが、それでも私の C++ アプリケーションからバイト文字列を受け取ることができるはずです。これらのバイトを Flash に渡して、意図した Unicode をレンダリングする方法が必要だと思います。だから私がこれまでにやったこと:

C++:

//an example wchar_t*
const wchar_t *text = L"Test!";

//this function pushes a char* to my Lua code
lua.PushString((char*)text); //directly casting text to a char*... D:

ルア:

theString = FunctionThatGetsWCharFromCpp();
flash.ShowString(theString);

閃光:

function ShowString(theString:String)
{
    myTextField.text = theString;
}

ここでの結果は、myTextField「T」のみが表示されることです。これは私には理にかなっています。特に "T" は a の両方のバイトを実際には使用しないため、wchar_ttoからのキャストcharは s にいくつかのゼロを埋め込むことになります。ドキュメントをざっと見てみると、次のようになります。charwchar_t

lua_pushstring

文字列にゼロを埋め込むことはできません。最初のゼロで終了すると見なされます。

だから私は少しテストを実行しました:

C++:

//prefixing with a Japanese character 
//which will use both bytes of the wchar_t
const wchar_t *text = L"たTest!";

Flash のテキストボックスに「_0T」、3 文字が表示されるようになりました。日本語の文字の 2 バイト + T、そして終端です。

何が起こっているのかは理解していますが、この問題にどう対処すればよいのか、まだ完全にはわかりません。そして、何を検索すればよいか本当にわかりません。C++ から Lua にバイトの塊を渡すために使用できる特定の Lua 関数はありますか (lua_pushlstringこれによく使用される場所を読んだことがありますが、最初のゼロでも終了します)。これらのバイトを受け入れる Flash データ型はありますか? その場合、読み取り可能なマルチバイト文字列に変換する必要がありますか? それともこれは本当に不可能ですか?

注:
私は Unicode やコード ページなどにあまり詳しくないので、Flash で正しいエンコーディングを指定して正しいエンコーディングを取得できるようにする必要があるかどうかもわかりません。出力 - しかし、そこに着いたら喜んでその橋を渡ります。

4

1 に答える 1

1

これが機能するかどうかはわかりませんが、UTF-8を使用することをお勧めします。UTF-8 でエンコードされた文字列にはゼロが埋め込まれていないため、Lua はそれを処理できるはずであり、Flash もそれを処理できるはずですが、言語のインターフェースがどの程度正確かによって異なります。

を使用してワイド文字列を UTF-8 に変換する 1 つの方法を次に示します。setlocale(3) wcstombs(3)

// Error checking omitted for expository purposes

// Call this once at program startup.  If you'd rather not change the locale,
// you can instead write your own conversion routine (but beware of UTF-16
// surrogate pairs if you do)
setlocale(LC_ALL, "en_US.UTF-8");

// Do this for each string you want to convert
const wchar_t *wideString = L"たTest!";
size_t len = wcslen(wideString);
size_t maxUtf8len = 4 * len + 1;  // Each wchar_t encodes to a max of 4 bytes
char *utf8String = new char[maxUtf8len];
wcstombs(utf8String, wideString, maxUtf8len);
...
// Do stuff with utf8string
...
delete [] utf8String;

Windows を使用している場合は、Visual Studio C ランタイムが UTF-8 ロケールをサポートしているとは思わないため、代わりWideCharToMultiByteにコード ページで関数を使用して変換を行うことができます。CP_UTF8

// Error checking omitted for expository purposes
const wchar_t *wideString = L"たTest!";
size_t len = wcslen(wideString);
size_t maxUtf8len = 4 * len + 1;  // Each wchar_t encodes to a max of 4 bytes
char *utf8String = new char[maxUtf8len];
WideCharToMultiByte(CP_UTF8, 0, wideString, len + 1, utf8String, maxUtf8len, NULL, NULL);
...
// Do stuff with utf8string
...
delete [] utf8String;
于 2013-04-04T02:41:32.073 に答える