【发布时间】:2012-05-06 14:52:06
【问题描述】:
我正在处理 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 的客户端部分出现错误的根本原因。这个编码的整数被发送回客户端,然后客户端执行逆运算(从 char 中减去 32 并强制转换以获得 int 返回)。
似乎'?'由客户端处理模块按字面意思表示,因为该条被“?”的映射整数值冗余填充。直到服务器开始发回小于 95 的值。
- 作者的平台上可能使用了哪些字符编码?
- 我的平台上到底发生了什么不同的事情?
- 在您看来,解决此问题最简单的方法是什么?
【问题讨论】:
-
如果它只使用 ASCII,它最多只能工作 95,因为 ASCII 只能达到 127 (95+32)。
标签: java character-encoding legacy legacy-code