毛病体式格局:
response.setHeader("Content-Disposition", "inline;filename="+ new String(fileName.getBytes(),"utf-8")); String fileName = aicaseNodeDeptService.getFilename(request)+".xlsx"; response.setCharacterEncoding("UTF-8"); response.setContentType("application/ms-excel");
准确的体式格局
response.setHeader("Content-Disposition","inline;filename="+new String(fileName.getBytes("utf-8"),"iso8859-1"));
缘由:httpheader请求其内容必需为iso8859-1编码,在将这些字符通报到目的地后,目的地顺序再经由过程相反的体式格局Strings_utf8 = newString(s_iso88591.getBytes("ISO8859-1"),"UTF-8")来获得准确的中文汉字"中",如许就既保证了恪守协定划定、也支撑中文。
在Java中,String的getBytes()要领是获得一个操作系统默许的编码花样的字节数组。这示意在差别的操作系统下,返回的东西不一样!
String.getBytes(Stringdecode)要领会依据指定的decode编码返回某字符串在该编码下的byte数组示意,如:
byte[] b_gbk = "中".getBytes("GBK"); byte[] b_utf8 = "中".getBytes("UTF-8"); byte[] b_iso88591 = "中".getBytes("ISO8859-1");
将离别返回"中"这个汉字在GBK、UTF-8和ISO8859-1编码下的byte数组示意,此时
b_gbk的长度为2,
b_utf8的长度为3,
b_iso88591的长度为1。
而与getBytes相对的,能够经由过程new String(byte[], decode)的体式格局来复原这个"中"字,
这个new String(byte[],decode)现实是运用指定的编码decode来将byte[]剖析成字符串.
String s_gbk = new String(b_gbk,"GBK"); String s_utf8 = new String(b_utf8,"UTF-8"); String s_iso88591 = new String(b_iso88591,"ISO8859-1");
经由过程输出s_gbk、s_utf8和s_iso88591,会发明s_gbk和s_utf8都是"中",而只要s_iso88591是一个不被辨认的字符(能够理解为乱码),为何运用ISO8859-1编码再组合以后,没法复原"中"字?
缘由很简单,由于ISO8859-1编码的编码表基础就不包括汉字字符,固然也就没法经由过程"中".getBytes("ISO8859-1");来获得准确的"中"字在ISO8859-1中的编码值了,所以,再经由过程newString()来复原就更是无从谈起。
因而,经由过程String.getBytes(Stringdecode)要领来获得byte[]时,一定要肯定decode的编码表中确切存在String示意的码值,如许获得的byte[]数组才准确被复原。
更多java学问请关注java基础教程栏目。
注重:
有时候,为了让中文字符顺应某些特殊请求(如httpheader请求其内容必需为iso8859-1编码),可能会经由过程将中文字符根据字节体式格局来编码的状况,如:
String s_iso88591 = newString("中".getBytes("UTF-8"),"ISO8859-1"),如许获得的s_iso8859-1字符串现实是三个在ISO8859-1中的字符,在将这些字符通报到目的地后,目的地顺序再经由过程相反的体式格局Strings_utf8 = newString(s_iso88591.getBytes("ISO8859-1"),"UTF-8")来获得准确的中文汉字"中",如许就既保证了恪守协定划定、也支撑中文。
以上就是java中excel导出乱码解决要领的细致内容,更多请关注ki4网别的相干文章!