String 如何在Java中执行独立于编码的字符串比较?

String 如何在Java中执行独立于编码的字符串比较?,string,encoding,equals,string-comparison,compareto,String,Encoding,Equals,String Comparison,Compareto,我在比较字符串时遇到了一个奇怪的问题。我从客户端向服务器发送一个字符串(使用getBytes())作为字节。通过使用-Dfile.encoding=UTF-8启动客户端和服务器,我确保了它们的编码是相同的 当我试图对从客户端收到的字符串执行valueOf以将其转换为枚举时,我注意到了这个问题。当我打印出字符串时,它们看起来完全一样。但是当我执行比较时,我得到一个非零的数字,等于返回false 我假设这是一个编码问题。但我不太确定——对于使用套接字进行客户机-服务器编程,我还是有点新手 这就是我得

我在比较字符串时遇到了一个奇怪的问题。我从客户端向服务器发送一个字符串(使用
getBytes()
)作为字节。通过使用
-Dfile.encoding=UTF-8
启动客户端和服务器,我确保了它们的编码是相同的

当我试图对从客户端收到的字符串执行
valueOf
以将其转换为枚举时,我注意到了这个问题。当我打印出字符串时,它们看起来完全一样。但是当我执行
比较时,我得到一个非零的数字,
等于
返回
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);
更新

下面是我如何从流中重建字符串。也许这就是我做错的地方

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

我的猜测是,由于缓冲区比字符串大,所以在重新设置的字符串中添加了空值。在Java中,将null嵌入字符串中是合法的(与C和company不同),尽管Java处理它们的方式与标准UTF-8不同

尝试记录读取的长度,并将该长度传递给字符串构造函数:

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

您的问题在于如何构造字符串。您正在将字节读入长度为1024的缓冲区,但并没有告诉字符串构造函数只查看相关点。所以你的代码应该是

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

使用
java.text.Collator
来比较字符串。

您能在调试器中运行,在比较中设置断点,然后深入查看客户端和枚举字符串吗?您如何重新分析字符串?@Rob-我想这样做,这变成了另一个问题:)这是一个swing应用程序。你对我如何在上面运行调试器有什么建议吗?我主要从事基于web的应用,通过连接tomcat进行调试。如果您尚未在Eclipse或NetBeans中开发应用,请下载Eclipse或NetBeans并将源文件复制到新项目中。然后单击“调试”按钮而不是普通的“运行”按钮来运行它。我理解不想使用完整的IDE来编写代码。。。但在调试中不使用它?这真是胡说八道!:)@Steve我使用IntelliJ Idea:)在那里,您必须通过连接到端口(或类似性质的东西)来设置调试器。我还在想办法:)