我正在研究一个早在90年代初编写的Java游戏的源代码。如果我没记错的话,它是为JDK 1.1编写的。
在代码的某个地方,将int原始数据类型(范围在0到约120之间)转换为字符。这里有一个例子:
char c = (char)(i+32);
对于大于95的整数,这会造成问题。以下是代码和测试用例的部分输出:
for(int i = 120; i >= 0; i--)
System.out.println(i + " -> " + (char)(i+32));
输出:
...
100 -> ?
99 -> ?
98 -> ?
97 -> ?
96 -> ?
95 ->
94 -> ~
93 -> }
92 -> |
91 -> {
90 -> z
89 -> y
88 -> x
87 -> w
...
3 -> #
2 -> "
1 -> !
0 ->
整数值似乎因索引超过正常字符值的范围而丢失。
这似乎是游戏UI客户端部分 bug 的根本原因。编码整数被发送回客户端,然后执行反操作 (从 char 中减去 32 并转换为 int)。
似乎客户端处理模块将 '?' 文字面意义地解释为映射的整数值填充到 bar 上,直到服务器开始发送小于 95 的值。
以下是需要回答的问题:
1. 作者平台上可能使用了哪种字符编码? 2. 在我的平台上会发生什么不同的事情? 3. 在您看来,最简单的解决方案是什么?