2011-08-28 113 views
3

我正面临一些编码问题,我无法找到正确的解决方案。C#TCP服务器和Java TCP客户端之间的编码问题

我有一个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); 
} 

对于这个简单的测试,输出显示的是:

ß 

我做了一些测试,打印出每种语言的字节[]并同时在C#中的输出为: 195,161

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

这会不会有签名的(JAVA)做无符号(C# )的字节类型?

任何反馈,非常感谢。

+0

不是一个答案,但一个数据点反正 - Python做解码C#版本,你打算:'打印'。加入(对于x CHR(x)在[195,161])进行解码( 'utf-8') - >á'。显然,如果我尝试保持这个顺序,java的一个不是有效的utf-8。 – viraptor

+0

谢谢,我还在试验。 (到目前为止没有运气)。 – jcgarciam

+0

我在上面的例子中犯了一个错误(我已经编辑它),在java byte []中打印为:-61,-95。这是一个有效的UTF8字符。问题似乎在于操作系统(窗口)本身。我不知道它有什么奇怪的设置打印错误的字符。 – jcgarciam

回答

1

对我来说这似乎是一个字节序的问题...你可以通过打印字符串之前扭转的Java字节检查...

通常会通过包括BOM来解决......看到http://de.wikipedia.org/wiki/Byte_Order_Mark

+0

如果是utf-8,那么不需要BOM,也不会改变任何东西。 utf-8编码总是具有相同的表示形式 - 在小型和大型机器上。 (http://unicode.org/faq/utf_bom.html#bom5) – viraptor

+0

在读完C#和Java中的Endian之后,我仍然有同样的印象。 – jcgarciam

+0

我认为问题可能出现在服务器正在运行的地方,创建一个应该打印的简单Java程序 - >并在那里运行它打印奇怪的字符,而在其他操作系统(Linux)上打印正确字符。所以我只是丢弃了Socket并从End To End编码。 – jcgarciam

0

你确定这不是你试图编码为UTF-8数据的字节的Unicode字符吗?

我发现下面有一个有用的测试方法,可以在发送之前查看该字符串中的数据是否为正确的UTF-8。

How to test an application for correct encoding (e.g. UTF-8)

+0

我不完全理解你的陈述。从我上面的例子中,我只是得到UTF-8 byte []来测试编码。 – jcgarciam