4

文字列の比較で奇妙な問題が発生しています。クライアントからサーバーに文字列を (を使用してバイトとしてgetBytes()) 送信します。クライアントとサーバーの両方で-Dfile.encoding=UTF-8.

valueOfクライアントから受け取った文字列を列挙型に変換しようとしたときに、この問題に気付きました。文字列を印刷すると、まったく同じに見えます。しかし、 を実行するcompareToと、ゼロ以外の数値equalsが返され、 が返されますfalse

エンコードの問題だと思います。よくわかりませんが、ソケットを使用したクライアントサーバープログラミングに関しては、まだ少し初心者です。

これは私が得るものです:

Waiting for connections on port 9090
Connected to client: 127.0.0.1
received command: GetAllItems
The value is |GetAllItems| (from client)
The value is |GetAllItems| (from enum)
equals: false

私は何を間違っていますか?

アップデート

ストリームから文字列を再構成する方法は次のとおりです。おそらく、これは私が何か間違ったことをしている場所ですか?

byte[] commandBytes = new byte[1024];
in.read(commandBytes); //in is a BufferedInputReader
String command = new String(commandBytes);
4

3 に答える 3

4

私の推測では、バッファーが文字列よりも大きいため、再構成された文字列に null が追加されています。Java では、標準の UTF-8 とは異なる方法でヌルを処理しますが (C や会社とは異なり)、Java の文字列内にヌルを埋め込むことは合法です。

読み取った長さを記録してみて、その長さを文字列コンストラクターに渡します。

int bytesRead = in.read(commandBytes);
String command = new String(commandBytes, 0, bytesRead);
于 2010-10-01T17:24:16.723 に答える
3

問題は、文字列の作成方法にあります。バイトをバッファー長 1024 に読み込んでいますが、String コンストラクターに関連するポイントのみを見るように指示していません。だからあなたのコードは...

byte[] commandBytes = new byte[1024];
int length = in.read(commandBytes); //in is a BufferedInputReader
String command = new String(commandBytes, 0, length);
于 2010-10-01T17:29:29.053 に答える
2

java.text.Collator文字列を比較するために使用します。

于 2012-02-02T09:03:07.193 に答える