2010-10-01 108 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比较字符串。