查看: 196|回复: 6

【TC开发者的痛】解决控制台使用GM命令输出的中文变问号

[复制链接]

92

时沙

20

精华

27

主题

声望: 1206   虚弱: 0

Lv.6

万神殿炉石金鸡报晓瓦兰纳尔·远古王者之锤大咕咕幼崽

发表于 2019-8-8 17:46:39 | 显示全部楼层 |阅读模式
本帖最后由 serayn 于 2019-8-10 15:42 编辑

问题背景

从某个版本的TC开始,TC的源码的默认编码从UTF8改为了Latin1.也是从这个版本的TC开始,控制台的中文输出就出现异常了。
一开始只是输出乱码,后来改为了输出问号。
时光荏苒,那么多个版本过去了,TC的这个问题依然没有解决,甚至扩散到基于TC工作的各种其他项目中去。
然而AZ中却从未出现过这个问题。
做335时姑且可以放弃TC阵营投入AZ的怀抱,但是做高版本时,这就是个无法回避的痛点。
本帖子就是关于解决这个问题的。

======================================================
问题的原理

讲真,我没太搞懂。
大体上我理解是这样的:字符串的文本默认是8位的utf8编码,直接显示utf8编码的话,因为utf8编码比较短而且相对不够规范,所以会导致一些内存的潜在问题风险,于是需要把utf8编码的内容转成更规范的16位utf8编码(宽编码?)来进行处理。但是windows系统中没法处理16位utf8编码,何况控制台输出只能识别控制台的系统编码(我这里是GBK),就算真实的8位utf8输出出来也是乱码,所以16位的utf8编码在输出之前,还是需要多加一道工序转换成windows能识别的编码。

======================================================
处理方法

在TC(以及基于TC的各个项目,包括AZ)中,处理这个部分的文件都是src/server/worldserver/commandline/CliRunnable.cpp中的utf8print函数。
其中,TC的处理方法是这样的:
导致TC的控制台命令编码错乱的位置.png
而AZ的处理方法是这样的:
AZ的控制台则毫无问题.png
可以看到,两者的差别就是Az多了一个转换,最后用printf而不是wprintf来输出控制台。
那么,要解决的话很简单,照抄AZ就可以了。
但是Az中多出来的CharToOemBuff函数,是Windows的系统函数,所以还需要在这个文件的顶端多加一段
  1. #if TRINITY_PLATFORM == TRINITY_PLATFORM_WINDOWS
  2. #include <windows.h>
  3. #endif
复制代码
加完之后,保存,然后最好重新cmake一下,即可完成。


备注:已根据Ayase的建议把单行的#include改为了普适性更强的一段预处理代码。复制使用即可。
并且在该文件最顶端的地方,加上这一行,并且重新cmake.png

23

时沙

0

精华

2

主题

声望: 376   虚弱: 0

Lv.2

光荣的伸手党

炉石

发表于 2019-8-8 19:04:55 | 显示全部楼层
作为拿来主义者,暂时还没接触编译这块,现在慢慢开始学习,希望能像各位一样能做出点自己的东西
好吧,其实我压根就没看懂

23

时沙

0

精华

3

主题

声望: 204   虚弱: 0

Lv.2

炉石

发表于 2019-8-8 20:41:53 | 显示全部楼层
薇神这段时间疯狂发教程啊 支持一下

621

时沙

0

精华

7

主题

声望: 300   虚弱: 0

Lv.3

uiwow(lulus制)炉石金鸡报晓积少成多时沙之瓶大咕咕幼崽Doge银色北伐军

发表于 2019-8-9 08:20:03 | 显示全部楼层
前人栽树,后人乖凉,感谢解惑
[发帖际遇]: foxooo盗窃之翼打造铠甲的源质矿,卖得496 金币,导致之翼大闹破烂市场. 幸运榜 / 衰神榜

961

时沙

35

精华

99

主题

声望: 7961   虚弱: 0

Lv.9

只想安静的打酱油

万神殿圣光永恒炉石龙父之牙泰坦之握金鸡报晓瓦兰纳尔·远古王者之锤积少成多时沙之瓶炉石天马为了部落!Doge埃辛诺斯双刃泰蕾苟萨的寄魂杖大咕咕幼崽雷施哼哼(lulus制)uiwow(lulus制)银色北伐军黑色宝石猎豹泰兰德·语风莉莉安·沃斯

发表于 2019-8-9 21:38:40 | 显示全部楼层
#include <windows.h>建议加上

#if TRINITY_PLATFORM == TRINITY_PLATFORM_WINDOWS
#include <windows.h>
#endif

适应linux的编译..

107

时沙

0

精华

5

主题

声望: 450   虚弱: 0

Lv.2

炉石银色北伐军

发表于 2019-8-10 11:26:00 | 显示全部楼层
学习了,感谢大神们的经验分享
[发帖际遇]: lookatme7086在破碎海岸抗击燃烧军团,死战不退英勇就义,获得7 声望. 幸运榜 / 衰神榜

92

时沙

20

精华

27

主题

声望: 1206   虚弱: 0

Lv.6

万神殿炉石金鸡报晓瓦兰纳尔·远古王者之锤大咕咕幼崽

 楼主| 发表于 2019-8-10 15:39:09 | 显示全部楼层
ayase 发表于 2019-8-9 21:38
#include 建议加上

#if TRINITY_PLATFORM == TRINITY_PLATFORM_WINDOWS

受教了,棒棒哒!
您需要登录后才可以回帖 登录 | 入驻

本版积分规则

快速回复 返回顶部 返回列表