我遇到了一些编码问题,但我无法找到正确的解决方法。
我有一个作为Windows服务运行的C# TCP服务器,接收和响应XML。问题出现在输出中传递特殊字符时,例如带有重音符号(如á,é,í和其他字符)的西班牙字符。
服务器响应使用UTF-8进行编码,而Java客户端使用UTF-8进行读取。但是,当我打印输出时,这些字符完全不同。
这个问题只发生在Java客户端中(C# TCP客户端按预期工作)。
以下是演示编码问题的服务器代码片段: C#服务器
我有一个作为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#)有关?
非常感谢您的任何反馈。
print ''.join(chr(x) for x in [195, 161]).decode('utf-8') -> á
。如果我尝试保留Java的顺序,则其不是有效的UTF-8编码。 - viraptor