0

我目前正在开发一个与 Lua 相关联的 C++ 应用程序,该应用程序与 Flash 相关联(按此顺序)。我目前的目标是wchar_t通过 Lua 将 s 从 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:

卢阿:

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

闪光:

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

现在这里的结果是myTextField只显示“T”。这对我来说很有意义。从wchar_tto的转换char最终会char用一些零填充 s ,特别是因为 "T" 并没有真正利用 a 的两个字节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 个字符。完全有道理,日语字符 + T 的 2 个字节,然后终止。

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

注意:
我不太熟悉 Unicode 和代码页等等,所以我不太确定是否还有一个步骤我需要在 Flash 中指定正确的编码,以便我可以得到正确的输出 - 但是当我到达那里时我很高兴穿过那座桥,但是如果有人在这里也有任何见解,那就太好了!

4

1 回答 1

1

我不知道这是否可行,但我建议尝试使用UTF-8。以 UTF-8 编码的字符串中没有任何嵌入的零,因此 Lua 应该能够处理它,而 Flash 也应该能够处理它,这取决于语言接口的精确程度。

这是使用以下方法将宽字符字符串转换为 UTF-8 的一种方法: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,则可以改为使用WideCharToMultiByte带有CP_UTF8代码页的函数来进行转换,因为我不相信 Visual Studio C 运行时支持 UTF-8 语言环境:

// 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 回答