你得理解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之类的方法。