84669 人学习
152542 人学习
20005 人学习
5487 人学习
7821 人学习
359900 人学习
3350 人学习
180660 人学习
48569 人学习
18603 人学习
40936 人学习
1549 人学习
1183 人学习
32909 人学习
认证高级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字节。若是奇数个汉字,最后一个字节转换时会计算错误输出?,还是会乱码。