C# TCP服务器和Java TCP客户端之间的编码问题

3
我遇到了一些编码问题,但我无法找到正确的解决方法。
我有一个作为Windows服务运行的C# TCP服务器,接收和响应XML。问题出现在输出中传递特殊字符时,例如带有重音符号(如á,é,í和其他字符)的西班牙字符。
服务器响应使用UTF-8进行编码,而Java客户端使用UTF-8进行读取。但是,当我打印输出时,这些字符完全不同。
这个问题只发生在Java客户端中(C# TCP客户端按预期工作)。
以下是演示编码问题的服务器代码片段: C#服务器
   byte[] destBytes = System.Text.Encoding.UTF8.GetBytes("á");
    try
    {
       clientStream.Write(destBytes, 0, destBytes.Length);
       clientStream.Flush();
    }catch (Exception ex)
    {
       LogErrorMessage("Error en SendResponseToClient: Detalle::", ex);
    }

Java客户端:

socket.connect(new InetSocketAddress(param.getServerIp(), param.getPort()), 20000);
InputStream sockInp = socket.getInputStream();
InputStreamReader streamReader = new InputStreamReader(sockInp, Charset.forName("UTF-8"));
sockReader =  new BufferedReader(streamReader);
String tmp = null;
while((tmp = sockReader.readLine()) != null){
  System.out.println(tmp);
}

对于这个简单的测试,输出结果如下:

ß

我进行了一些测试,打印出了每种语言的byte[]。在C#上,á的输出为:195,161

在Java中,byte []读取的打印结果为: -61,-95

这是否与byte类型的有符号(Java)和无符号(C#)有关?

非常感谢您的任何反馈。


虽然不是答案,但还是提供一个数据点 - Python确实按照您的意图解码了C#版本:print ''.join(chr(x) for x in [195, 161]).decode('utf-8') -> á。如果我尝试保留Java的顺序,则其不是有效的UTF-8编码。 - viraptor
谢谢,我还在试验中(到目前为止没有运气)。 - jcgarciam
我在上面的例子中犯了一个错误(我已经进行了编辑)。在Java中,byte[]打印为:-61,-95。这是一个有效的UTF8字符。问题似乎出在操作系统(Windows)本身。我不知道它有什么奇怪的设置,会打印出错误的字符。 - jcgarciam
2个回答

1
在我看来,这似乎是一个字节序问题...你可以在打印字符串之前在Java中反转字节来检查它...
通常可以通过包含BOM来解决这个问题...请参见http://de.wikipedia.org/wiki/Byte_Order_Mark

我也有同样的印象,在阅读了关于C#和Java中字节序的内容后。 - jcgarciam
如果是utf-8编码,则不需要BOM,也不会改变任何内容。utf-8编码始终具有相同的表示方式 - 在小端和大端机器上都是如此。(http://unicode.org/faq/utf_bom.html#bom5) - viraptor
我认为问题可能出在运行服务器的SO上,创建一个简单的Java程序应该打印-> á并在那里运行它也会打印出奇怪的字符,而在其他操作系统(Linux)上,它正确地打印了预期的字符。因此,我只是放弃了Socket和端到端的编码。 - jcgarciam
如果操作系统有一些奇怪的设置,可能会发生这种情况 :-( - Yahia
有什么建议我应该在操作系统设置中查看吗?区域设置? - jcgarciam
可能是Java运行时中的某个东西...抱歉,我真的不知道该去哪里找 :-( - Yahia

0

我不太理解你的陈述。从我的上面的例子中,我只得到了á的UTF-8字节数组来测试编码。 - jcgarciam

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接