通过以下句子转换 就能正常显示中文数据了
new String(数据.getBytes("ISO8859_1"),"UTF-8");但有点不理解 数据.getBytes("ISO8859_1") 因为http是ISO8859_1的规则 (这了解) 而我转化为UTF-8(长度不定)
假如 UTF-8就是3字节存储(好举例子) 且客户端以2字节存储
数据在客户端为 AA AA AA  3个中文字  
通过http传输 变为  A A A A A A  
在到我这new String(数据.getBytes("ISO8859_1"),"UTF-8");
AAA AAA
这就变成俩个中文字 
请问这到底是个么原理啊

解决方案 »

  1.   

    首先,前台三个汉字,到后台不可能变成两个汉字。你的理解还是有问题,
    前台(通常是GBK编码),三个汉字为 AA AA AA(实际上UTF-8在前台用的也很多,这时候按照你的假设,在前台就已经是AAA AAA AAA,我们暂且不考虑这种情况),
    传输,编码为ISO8859-1,这时候,一个汉字,往往需要被编码成3个字节,这样传输的内容变成:A A A A A A A A A,
    后台,
    第一步:应用容器有可能先对数据做一次转换,比如:tomcat的URIEncoding参数就会影响。
    但到java中,java总是“认为”字符串是UNICODE的,但因为这种假设有可能错误,所以,才需要我们自己按正确的编码格式先转成bytes,然后再以utf格式变成字符串。不知道这个理解还有没有错误,希望大家批评。
      

  2.   

    用new String(数据.getBytes("ISO8859_1"),"UTF-8"); 
    的原因是你的页面字符集是utf-8,然而tomcat默认的编码方式是iso-8859-1,也就是说,tomcat把你页面提交的byte[]都用iso-8859-1编码成String了,
    所以这个时候直接拿string是乱码,这个时候string.getBytes("ISO8859_1")得到的是页面提交过来的byte[],由于这个byte[]是页面的string按照utf-8编码的,所以要new String(byte[],"utf-8");iso-8859-1并不是http的规则,只是tomcat的默认编码方式而已,不同的应用服务器会不一样,后面那个utf-8则是根据你的页面的字符集编码决定的
      

  3.   

    同意三楼的说法。关键在于解码时使用的字符集要与编码时使用的字符集保持一致,如果不一致就可能出现乱码。此时要做的就是将问题字符串重新编码,再使用正确的字符集解码。这也就是 new String(数据.getBytes("ISO8859_1"),"UTF-8"); 这个语句所起的作用。接收到的数据是"UTF-8"编码的,但接收方错误的使用ISO8859_1对其解码,导致生成的字符串中存在乱码。为了纠正这一错误,对生成的字符串使用ISO8859_1编码,得到原始的字节序列,然后用UTF-8解码,这样就能得到正确的字符串了。