我正在搞乱九十年代初编写的旧 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 的客户端部分出现错误的根本原因。这个编码的整数被发送回客户端,然后客户端执行逆运算(从 char 中减去 32 并强制转换以获取 int 返回)。
似乎是'?由客户端处理模块按字面意思表示,因为该条被“?”的映射整数值冗余填充。直到服务器开始发回小于 95 的值。
- 作者的平台上可能使用了哪些字符编码?
- 我的平台上到底发生了什么不同的事情?
- 在您看来,解决这个问题最简单的方法是什么?