90 年代前半に書かれた古い Java ゲームのソース コードをいじっています。私の記憶が正しければ、JDK 1.1 用に書かれています。
コードのどこかで、int プリミティブ (0 から約 120 の範囲) が char に変換されます。次に例を示します。
char c = (char)(i+32);
これにより、int が 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 より小さい値を送り返すまで。
- 作成者のプラットフォームで使用された可能性のある文字エンコーディングは?
- 私のプラットフォームでは、具体的に何が違うのでしょうか?
- この問題の最も簡単な解決策は何だと思いますか?