java导出错误方式与正确方法:(推荐:java视频教程)
错误方式: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[]数组才能正确被还原。
注意:
有时候,为了让中文字符适应某些特殊要求(如httpheader要求其内容必须为iso8859-1编码),可能会通过将中文字符按照字节方式来编码的情况,如:
string s_iso88591 = newstring(中.getbytes(utf-8),iso8859-1),这样得到的s_iso8859-1字符串实际是三个在iso8859-1中的字符,在将这些字符传递到目的地后,目的地程序再通过相反的方式strings_utf8 = newstring(s_iso88591.getbytes(iso8859-
更多java知识请关注java基础教程栏目。
以上就是java导出excel乱码原因及解决方法的详细内容。