通过Lua将C++中的wchar_t转移到Flash中。

我目前正在使用C++编写一个应用程序,它与Lua和Flash相互关联(按照这个顺序)。我目前的目标是通过Lua将wchar_t从C++传递到Flash。我希望能够获得任何有关如何完成此操作的见解!

如果需要任何其他信息,请问我,我会尽力提供


我尝试过的

我了解到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:

Lua:

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

Flash:

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

现在的结果是,myTextField只显示“T”。这让我很清楚。从wchar_tchar的转换最终会使用一些零填充char,特别是因为“ T”实际上并没有使用wchar_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,然后终止。

我知道正在发生什么,但我仍然完全不确定如何解决这个问题。而且我真的不确定要搜索什么。是否有特定的Lua函数可以从C ++传递一堆字节到Lua(我在某个地方读到过lua_pushlstring通常用于此,但它也在第一个零中终止)?是否有一种Flash数据类型可以接受这些字节,然后我需要进行某种转换,以将它们转换为可读的多字节字符串?还是这根本不可能?

注:

我对Unicode和编码页面等方面不是很熟悉,因此我不太确定是否还需要一步,即需要在Flash中指定正确的编码,以便我可以获得正确的输出 - 但是如果有人在这里也有任何见解,那将是极好的!

点赞
用户9530
用户9530

我不确定这是否有效,但我建议尝试使用 UTF-8。使用UTF-8编码的字符串中没有任何嵌入的零,因此Lua应该能够处理它,Flash也应该能够处理,具体取决于两种语言接口的方式。

以下是一种将宽字符字符串转换为UTF-8的方法,使用 setlocale(3) wcstombs(3)

//出于解释性目的省略了错误检查

// 在程序启动时仅调用一次此函数。如果您不想更改语言环境,
//您可以编写自己的转换例程(但是要注意UTF-16代理对)
setlocale(LC_ALL,“en_US.UTF-8”);

//对于要转换的每个字符串都要执行此操作
const wchar_t *wideString = L"たTest!";
size_t len = wcslen(wideString);
size_t maxUtf8len = 4 * len + 1;  // 每个wchar_t最多编码为4个字节
char *utf8String = new char[maxUtf8len];
wcstombs(utf8String, wideString, maxUtf8len);
...
// 使用utf8string操作数据
...
delete [] utf8String;

如果您使用的是Windows,则可以使用 WideCharToMultiByte 函数,使用 CP_UTF8 代码页进行转换,因为我不认为Visual Studio C运行时支持UTF-8语言环境:

//出于解释性目的省略了错误检查
const wchar_t *wideString = L"たTest!";
size_t len = wcslen(wideString);
size_t maxUtf8len = 4 * len + 1;  // 每个wchar_t最多编码为4个字节
char *utf8String = new char[maxUtf8len];
WideCharToMultiByte(CP_UTF8, 0, wideString, len + 1, utf8String, maxUtf8len, NULL, NULL);
...
// 使用utf8string操作数据
...
delete [] utf8String;
2013-04-04 02:41:32