suchen

Heim  >  Fragen und Antworten  >  Hauptteil

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

PHP中文网PHP中文网2810 Tage vor436

Antworte allen(4)Ich werde antworten

  • 伊谢尔伦

    伊谢尔伦2017-04-18 10:05:23

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

    Antwort
    0
  • PHP中文网

    PHP中文网2017-04-18 10:05:23

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

    Antwort
    0
  • ringa_lee

    ringa_lee2017-04-18 10:05:23

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

    Antwort
    0
  • 迷茫

    迷茫2017-04-18 10:05:23

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

    Antwort
    0
  • StornierenAntwort