我如何将 lua_tostring() 中的值分配给 wstring 类型的变量或 utf-8 中的 const wchar_t* 类型的变量

How could I assign the value from lua_tostring() to a variable in type of wstring or const wchar_t* in utf-8

函数 lua_tostring() 的 return 值的类型是 const char*。但是,我有一个需要字符串作为参数的 C 函数。并且字符串将是UTF-8编码格式的中文。

extern "C" LUALIB_API int PrintString(lua_State * L) {
    const char* str = lua_tostring(L, 1) // Get the string parameter 
                                         // And the string is actually in utf-8 in Lua.

    const WCHAR* str_w = .../* somehow makes str been an const WCHAR* */

    SomeFuncNeedWCHAR(str_w) // Imagine this func need a const WCHAR* as parameter. 

    return 0;
}

我试过使用MultiByteToWideChar()

    int size = MultiByteToWideChar(CP_UTF8, 0, str, -1, NULL, -1);

    WCHAR* buffer = new wchar_t[size * sizeof(wchar_t)];
    MultiByteToWideChar(CP_UTF8, 0, str, -1, buffer, size * sizeof(wchar_t));

    SomeFuncNeedWCHAR(buffer)

    delete[] buffer;

但我猜str实际上是以UTF-8存储字符的,在这个转换之后,它会将一个utf-8转换成utf-8。 (我的意思是,它转换了两次)。所以我只想找到一种方法来将 lua_tostring() 中的 return 值解释为键入 const WCHAR*.

你基本上可以认为 SomeFuncNeedWCHAR() 有一些类似的行为,比如 MessageBoxExW() 以 UTF-8 显示消息框。

所以我想知道如何解决这个问题。谢谢!

您没有正确使用 MultiByteToWideChar()

具体来说,您在第一次调用时将其 cchWideChar 参数设置为 -1,而当它需要 0 时:

cchWideChar

Size, in characters, of the buffer indicated by lpWideCharStr. If this value is 0, the function returns the required buffer size, in characters, including any terminating null character, and makes no use of the lpWideCharStr buffer.

即使成功,您也过度分配了 buffer,严格来说这不是错误,但它是在浪费未使用的内存。

试试这个:

extern "C" LUALIB_API int PrintString(lua_State * L) {
    const char* str = lua_tostring(L, 1);

    int str_len = strlen(str) + 1; // avoid MBTWC() from needing to re-calculate the
                                   // same string length multiple times. Also include
                                   // the null terminator in the output...

    int w_len = MultiByteToWideChar(CP_UTF8, 0, str, str_len, NULL, 0);

    WCHAR* str_w = new WCHAR[w_len];
    MultiByteToWideChar(CP_UTF8, 0, str, str_len, str_w, w_len);

    SomeFuncNeedWCHAR(str_w);

    delete[] str_w;

    return 0;
}