Windows游戏:UTF-8,UTF-16,DirectX和Lua

Tho*_*ini 2 c++ windows lua encoding utf

我正在开发一个用于学习目的的Windows游戏(我正在学习DirectX).我希望它有UTF支持.

阅读这个问题我了解到windows使用的wchar_t是UTF-16.我希望我的游戏能够获得Lua脚本支持,而Lua并不太喜欢Unicode.它只是将字符串视为"字节流"; 这对UTF-8来说效果不错,但UTF-16几乎不可能使用.

长话短说:windows想要UTF-16,lua想要UTF-8.

所以我想,我们只是使用UTF-8与正常char*string!.length()会搞砸但是谁在乎呢?但它不起作用:

const char test_utf8[] = { 111, 108, 0xc3, 0xa9, 0 }; // UTF-8 for olè
mFont->DrawTextA(0, test_utf8, -1, &R, DT_NOCLIP, BLACK);
    /* DrawText is a Direct3d function to, well, draw text.
     * It's like MessageBox: it is a define to either DrawTextA
     * or DrawTextW, depending if unicode is defined or not. Here
     * we will use DrawTextA, since we are passing a normal char*. */
Run Code Online (Sandbox Code Playgroud)

这打印olé.换句话说,它似乎不使用UTF-8而是使用ISO-8859-1.

那么,我该怎么办?我能想到以下几点:

  1. 放弃UTF的想法; 使用ISO-8859-1并感到高兴(这是魔兽世界所做的,至少对于enUS版本而言)
  2. 将每一帧的每一个字符串从UTF-8转换为UTF-16(我担心性能问题,考虑到每个字符串每秒会执行60次以上,并且它是O(N)我很漂亮确定它会相当慢)
  3. 对于每个lua字符串,保留UTF-16副本; 浪费大量内存,很难实现(当他们在Lua中更改时保持UTF-16字符串更新等)

Han*_*ant 5

它也不使用8859-1,它使用您系统的本地代码页.您可以转换为UTF16并通过自己转换字符串来使用DrawText().如果您的类库没有任何支持,那么您可以使用MultiByteToWideChar().