认证高级PHP讲师
你得理解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类
如果你是客户端: 你从服务端拿到的字符串是 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字节。若是奇数个汉字,最后一个字节转换时会计算错误输出?,还是会乱码。
你得理解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类
如果你是客户端:
你从服务端拿到的字符串是 utf-8 编码,你需要显示的话,先将把字符串按照 utf-8 解码成字节码,然后再按照 GBK编码。
你发送给服务端的字符串也得是 utf-8 编码, 你需要将你的GBK编码的字符串,解码成字节码,然后再按照 utf-8 编码。
反之亦然。
之所以你看到的是乱码,可能是你的终端的编码问题?
可以通过iso8859-1编码作为中间字符串,如果gbk直接转utf–8时,即2字节转3字节。若是奇数个汉字,最后一个字节转换时会计算错误输出?,还是会乱码。