Java 两系统接口调用字符乱码问题?

1.两个系统间http协议接口调用,服务端系统编码格式是UTF-8,客户端系统是GBK,
而且两个系统均无法让步让编码统一,客户端端用的是GBK编码传中文,服务端怎么进行转换成UTF-8的,而且响应时还要转成GBK的?

2.首先肯定不能直接通过new String(str.getBytes("GBK"),"UTF-8");把GBK转成UTF-8,无论怎么转都是乱的,是不是需要单独写工具类进行转码啊?


摇曳的蔷薇
浏览 1091回答 4
4回答

临摹微笑

你得理解new String(str.getBytes("GBK"),"UTF-8");这句话的意义,才能知道为什么会失败。首先,Java里的String内部是UTF-16LE编码的。str.getBytes("GBK"),得到了一个Byte数组,内容是将str的编码转换为GBK。new String(str.getBytes("GBK"),"UTF-8"),则是将这个Byte数组的内容当作UTF-8编码的数据,转换为String(UTF-16LE)。明白了?这样能行才有鬼呢。客户端和服务器,他们只都是Java,那么Java里的String编码一定是UTF-16。不会受到系统编码(Windows或Linux)的影响。这种情况下最好不直接发送String,因为String会被你用的库它自动转换编码(以tomcat为例,默认iso8859-1)。如果你可以直接发送和接收Byte数组,那么你完全可以将协议规定UTF-8。任何一方接受数据都是new String(data, "UTF-8"),发送数据都是str.getBytes("UTF-8")。如果客户端代码你改不了或者用C等别的语言写的。你确定客户端发送的是GBK数据的话。如果你服务器能直接接收Byte数组,new String(data, "GBK"),这样就能解析。返回的时候同样是Byte数组str.getBytes("GBK")。如果只能发送和接收String,那么你需要配置它,设定它转换的编码。比如对于tomcat,对于GET的数据,需要修改web.xml,增加一个URL编码设置项。对于POST数据,则必须写一个filter进行转换。如果是HTTP通信类,则可能提供SetEncoding之类的方法。

蛊毒传说

如果是网址的话可以使用URLEncoder/URLDecoder类

ITMISS

如果你是客户端: 你从服务端拿到的字符串是 utf-8 编码,你需要显示的话,先将把字符串按照 utf-8 解码成字节码,然后再按照 GBK编码。 你发送给服务端的字符串也得是 utf-8 编码, 你需要将你的GBK编码的字符串,解码成字节码,然后再按照 utf-8 编码。 反之亦然。 之所以你看到的是乱码,可能是你的终端的编码问题?String gbkStr = new String(utf8Str.getBytes("utf-8"),"gbk");  String utf8Str = new String(gbkStr.getBytes("gbk"),"utf-8");  

MM们

可以通过iso8859-1编码作为中间字符串,如果gbk直接转utf–8时,即2字节转3字节。若是奇数个汉字,最后一个字节转换时会计算错误输出?,还是会乱码。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java