背景
C++程序作为ICE客户端通过ICE中间件发送消息给JAVA服务端程序。C++客户端以默认编码格式的字符串传输给JAVA服务端,导致中文乱码。
问题
C++客户端通过GBK格式发送如下消息给JAVA服务端:
"Name:"计算机监控快报","Status":"1","Type":"AGENT"
JAVA服务端收到消息直接打印输出结果如下:
表明中文乱码,考虑在JAVA服务端进行转换处理。JAVA端实现转为GB2312编码格式:
try{
System.out.println(System.getProperty("file.encoding"));// java默认编码是UTF-8
System.out.println(new String(inStr.getBytes(),"GB2312"));//inStr为收到C++发来的json字符串
}catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
转换后打印输出结果如下:
表明只能解析出部分字符,仍不能正确解析。
**所以,考虑在客户端进行处理。**即在C++客户端将json字符串转为UTF8编码格式发送给JAVA服务端。
JAVA服务端收到消息打印输出结果如下:
表明,可以可以正常解析,不存在中文乱码问题。
总结
C++程序在运行时,默认用GBK来处理字符串
Java程序在运行时,默认用UTF8来处理字符串
C++程序发送含中文字符串信息给JAVA程序时,应该在C++程序端将GBK转为UTF8格式进行传输。
同理,JAVA程序发送含中文字符串信息给C++程序时,应该在JAVA程序端将UTF8转为GBK格式进行传输。
即,传输中文数据时,最好在源头(发送端)进行编码格式处理,而不是在接收端处理。
传输英文时,不存在编码格式转换问题。