Cocos2d之控制台操作
问题
游戏全球化版本开发过程中,需要在控制台显示各种国家语言,而不是一堆乱码或?。
分析
字符集 & 代码页
关于字符集与字符编码可跳转文章 - 字符集与字符编码
MultiByteToWideChar 和 WideCharToMultiByte 是用于在 ANSI 和 Unicode 之间转换字符的 Unicode 和字符集函数。 这些函数可能会导致安全风险,因为它们以不同的方式对输入和输出缓冲区的元素进行计数。 例如, MultiByteToWideChar 采用以字节为单位计算的输入缓冲区,并将转换后的字符放入采用 Unicode 字符大小的缓冲区。 当应用程序使用此函数时,它必须正确调整缓冲区大小,以避免缓冲区溢出。
关于Windows的字符转换函数
编码格式 | 代码页 | |||
---|---|---|---|---|
GB2312 | 936 | |||
BIG5 | 950 | |||
UTF-16/Unicode | 1200 | |||
UTF-8 | 65001 |
在Windows控制台,可以通过 chcp xxx 调整代码页(仅限当前窗口有效,若要永久修改,需要修改注册表)
例如:
1 | REM 当前代码页修改为UTF8 |
Cocos2d 控制台
控制台的开启与参数的调整,都是看Windows API的支持。
创建与释放
1 | AllocConsole(); |
控制台函数可参考: Microsoft控制台函数
比如,关闭按钮禁止点击(这里面的枚举,自行查阅代码)
1 | DeleteMenu(GetSystemMenu(GetConsoleWindow(), FALSE), SC_CLOSE, MF_BYCOMMAND); |
解决
最终实际操作,就是将Cocos2d唤起的控制台中代码页调整为UTF8(65001)
在创建控制台后
1 | ////////// main.cpp |
此时,代码页已被修改为 UTF8;但是,仅仅是输出的修改;在向控制台传输的部分也需要同步去调整,就是上文所说的关于 MultiByteToWideChar 与 WideCharToMultiByte 部分。
1 | ////////// CCConsole.cpp |
问题:
- 不支持泰文的显示
- 发现通过代码页修改为65001,无法显示泰文
- 临时方案:可以通过输出到本地文件,获取内容