首先理解java的字符概念
java中字符串是字符的序列,虚拟机内部的字符都是16位的unicode字符,等价于C++中的WCHAR,也是为了实现虚拟机方便
WCHAR叫做宽字符,对应的MuitiChar叫做多字符,这种多字符中字符的位数不唯一
GBK 和 UTF8 是多字符的不同编码形式
s=new String(s.getBytes("gbk"),"utf-8");
的意思是:
byte[] bytes=s.getBytes("gbk");
s=new String(bytes,"utf-8");
第一句是将s对应的gbk编码转出来,形成一个字节流
第二句是将这个字节流按照utf-8编码转为java字符串,因此相当于将gbk编码的字节流当做utf-8来使用,这样在中文中会出现乱码
你的问题是,接口返回的已经是utf-8 所以它必须是byte[] 流,如果是字符串的话就不好办了
乱码问题不能只丛编码转化来解决,要从根源上解决! 一般都是用UTF-8编码!大致要分为3个步骤:
1:页面上要指定编码格式: <%@ page language = "java" contentTpye = "text/html; charset = UTF-8" pageEncoding = "UTF-8" %>
2: 工作空间指定编码格式 :WINDOWS --〉首选项 (pREFERENCES)--> General --->workspace 下 有一个 Text file encodeing 的区块 默认的是 GB18030 要选择other 值为 UTF-8; 旁边的 new text file line delimiter 也可以设置 选择other 值为 UTF-8,最好是默认Default.
3: 数据库的编码格式 最好也设置成UTF-8! 具体操作可询问dba ,或者上网查资料。
s是utf-8格式的,你用s.getBytes("gbk")就存在问题,有的不能转过来,所以你该这样s=new String(s.getBytes(),"utf-8");或s=new String(s.getBytes("utf-8"));这样就对了,这样得到的是正确的UTF-8,如果要最终转换成GBK,s=new String(s.getBytes("utf-8"), “gbk”);就可以啦
我理解是你写反了:
s=new String(s.getBytes("utf-8"),"gbk");
还有就是,请检查你直接用GBK格式输出看看对端给你的是否正确。也就是说先判断来源是否OK,再判断处理的是否OK
这个问题我之前回答过:http://zhidao.baidu.com/question/1301912846509946579.html?oldq=1
s=new String(s.getBytes("gbk"),"utf-8");
这种写法是错误的,要么
s=new String(s.getBytes("gbk"),"gbk");
要么
s=new String(s.getBytes("utf-8"),"utf-8");
另外请确认s原来的编码到底是什么是gbk,还是uft-8,如果原来s可以正常输出的话(应该不可能,不然就不会转码了),那就直接采用上面两种做法就可以了