我如何将 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;
}
函数 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 thelpWideCharStr
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;
}