Java 两系统接口调用字符乱码问题?
PHP中文网
PHP中文网 2017-04-18 10:03:23
0
4
439
PHP中文网
PHP中文网

认证高级PHP讲师

全部回复(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之类的方法。

Ty80

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

左手右手慢动作

如果你是客户端:
你从服务端拿到的字符串是 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");  
迷茫

可以通过iso8859-1编码作为中间字符串,如果gbk直接转utf–8时,即2字节转3字节。若是奇数个汉字,最后一个字节转换时会计算错误输出?,还是会乱码。

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板