Cocos2d之控制台

Cocos2d之控制台操作


问题

游戏全球化版本开发过程中,需要在控制台显示各种国家语言,而不是一堆乱码或?。



分析

字符集 & 代码页

关于字符集与字符编码可跳转文章 - 字符集与字符编码

MultiByteToWideChar 和 WideCharToMultiByte 是用于在 ANSI 和 Unicode 之间转换字符的 Unicode 和字符集函数。 这些函数可能会导致安全风险,因为它们以不同的方式对输入和输出缓冲区的元素进行计数。 例如, MultiByteToWideChar 采用以字节为单位计算的输入缓冲区,并将转换后的字符放入采用 Unicode 字符大小的缓冲区。 当应用程序使用此函数时,它必须正确调整缓冲区大小,以避免缓冲区溢出。
关于Windows的字符转换函数

常用代码页

编码格式 代码页
GB2312 936
BIG5 950
UTF-16/Unicode 1200
UTF-8 65001

在Windows控制台,可以通过 chcp xxx 调整代码页(仅限当前窗口有效,若要永久修改,需要修改注册表)
例如:

1
2
REM 当前代码页修改为UTF8
chcp 65001


Cocos2d 控制台

控制台的开启与参数的调整,都是看Windows API的支持。

创建与释放

1
2
AllocConsole();
FreeConsole();

控制台函数可参考: Microsoft控制台函数

比如,关闭按钮禁止点击(这里面的枚举,自行查阅代码)

1
2
DeleteMenu(GetSystemMenu(GetConsoleWindow(), FALSE), SC_CLOSE, MF_BYCOMMAND);
DrawMenuBar(GetConsoleWindow());




解决

最终实际操作,就是将Cocos2d唤起的控制台中代码页调整为UTF8(65001)

在创建控制台后

1
2
3
4
5
6
7
8
9
////////// main.cpp

AllocConsole();
// ...

SetConsoleCP(65001);
SetConsoleOutputCP(65001);

// ...

此时,代码页已被修改为 UTF8;但是,仅仅是输出的修改;在向控制台传输的部分也需要同步去调整,就是上文所说的关于 MultiByteToWideChar 与 WideCharToMultiByte 部分。

1
2
3
4
5
6
7
8
9
////////// CCConsole.cpp

// ...

MultiByteToWideChar(CP_UTF8, 0, tempBuf, -1, wszBuf, sizeof(wszBuf));
OutputDebugStringW(wszBuf);
// // 将WideCharToMultiByte转换注释掉
// WideCharToMultiByte(CP_ACP, 0, wszBuf, -1, tempBuf, sizeof(tempBuf), nullptr, FALSE);
printf("%s", tempBuf);

问题:

  • 不支持泰文的显示
    • 发现通过代码页修改为65001,无法显示泰文
    • 临时方案:可以通过输出到本地文件,获取内容