2010-10-01 52 views
4

我在比較字符串時遇到了一個奇怪的問題。我從客戶端向我的服務器發送一個字符串(使用getBytes()的字節)。我已經通過-Dfile.encoding=UTF-8啓動它們來確保客戶端和服務器上的編碼相同。如何在Java中執行獨立於編碼的字符串比較?

我注意到當我試圖對從客戶端接收的字符串執行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 

我在做什麼錯?

UPDATE

這裏是我如何重建從流的字符串。也許這是我做錯事的地方?

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

你可以在調試器中運行,在比較中放置一個斷點,然後在客戶端和枚舉字符串之間進行更深入的觀察? – 2010-10-01 17:18:38

+0

你如何重新分析你的字符串? – 2010-10-01 17:19:30

+0

@Rob - 我想和那變成另一個問題:)這是一個搖擺應用程序。你有什麼關於如何運行調試器的指針嗎?我主要從事基於網絡的應用程序,我通過連接到tomcat進行調試。 – 2010-10-01 17:20:41

回答

4

我的猜測是,因爲你的緩衝區比你的字符串大,所以在重新創建的字符串中增加了空值。儘管Java處理它們的方式與標準的UTF-8不同,但是將null嵌入到Java中的字符串中是合法的(與C和公司不同)。

嘗試記錄長度的讀取,並且長度傳遞給字符串構造:

int bytesRead = in.read(commandBytes); 
String command = new String(commandBytes, 0, bytesRead); 
+0

謝謝!就是這樣! – 2010-10-01 22:02:09

3

你的問題是你是如何構建的字符串。您正在將字節讀入緩衝區長度爲1024的字符串,但您並未告訴String構造函數只查看相關的點。所以你的代碼應該是...

byte[] commandBytes = new byte[1024]; 
int length = in.read(commandBytes); //in is a BufferedInputReader 
String command = new String(commandBytes, 0, length); 
2

使用java.text.Collator比較字符串。