通过以下句子转换 就能正常显示中文数据了
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
这就变成俩个中文字
请问这到底是个么原理啊
前台(通常是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格式变成字符串。不知道这个理解还有没有错误,希望大家批评。
的原因是你的页面字符集是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则是根据你的页面的字符集编码决定的