查看: 538|回复: 11

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

[复制链接]

112

时沙

21

精华

27

主题

声望: 1322   虚弱: 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

61

时沙

0

精华

3

主题

声望: 812   虚弱: 0

Lv.3

光荣的伸手党

炉石祖国万岁!!

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

75

时沙

0

精华

3

主题

声望: 227   虚弱: 0

Lv.2

炉石

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

721

时沙

0

精华

7

主题

声望: 419   虚弱: 0

Lv.4

炉石积少成多时沙之瓶银色北伐军金鸡报晓Dogeuiwow(lulus制)祖国万岁!!

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

1079

时沙

42

精华

104

主题

声望: 9944   虚弱: 0

管理员

只想安静的打酱油

万神殿圣光永恒炉石无冕者奔波尔菠萝泰坦之握金鸡报晓瓦兰纳尔·远古王者之锤积少成多时沙之瓶炉石天马为了部落!Doge雷施哼哼(lulus制)uiwow(lulus制)银色北伐军黑色宝石猎豹泰兰德·语风莉莉安·沃斯祖国万岁!!小咕

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

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

适应linux的编译..

201

时沙

0

精华

5

主题

声望: 852   虚弱: 0

Lv.3

炉石银色北伐军祖国万岁!!

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

112

时沙

21

精华

27

主题

声望: 1322   虚弱: 0

Lv.6

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

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

#if TRINITY_PLATFORM == TRINITY_PLATFORM_WINDOWS

受教了,棒棒哒!

52

时沙

0

精华

4

主题

声望: 389   虚弱: 0

Lv.2

炉石

发表于 2019-8-31 19:55:03 | 显示全部楼层
原来如此,难怪最近看中文都是方块呢

9

时沙

0

精华

0

主题

声望: 4   虚弱: 0

Lv.1

发表于 2019-10-26 22:25:06 | 显示全部楼层
不需要这么麻烦吧,调试器里面加上,u8就能看到

43

时沙

0

精华

2

主题

声望: 363   虚弱: 0

Lv.2

发表于 2019-10-31 10:06:36 | 显示全部楼层
最近学习编译,部分汉改后都是折叠问号,正好有你的经验,谢谢了
快速回复 返回顶部 返回列表