我最近在开发时遇到了文件另存为时文件名出现乱码,在火狐上正常的文件名,在IE中又出现乱码问题,然后好不容易在IE下调试好了文件名乱码问题,在火狐下又出现乱码,最后终于感觉这样是能解决了。具体如下:
1 public static String toUtf8String(String s) { 2 3 StringBuffer sb = new StringBuffer(); 4 for (int i = 0; i < s.length(); i++) { 5 char c = s.charAt(i); 6 if (c >= 0 && c <= 255) { 7 sb.append(c); 8 } else { 9 byte[] b; 10 try { 11 b = Character.toString(c).getBytes("utf-8"); 12 } catch (Exception ex) { 13 exceptionUtil.error("将文件名中的汉字转为UTF8编码的串时错误,输入的字符串为:" + s); 14 b = new byte[0]; 15 } 16 for (int j = 0; j < b.length; j++) { 17 int k = b[j]; 18 if (k < 0) 19 k += 256; 20 sb.append("%" + Integer.toHexString(k).toUpperCase()); 21 } 22 } 23 } 24 return sb.toString(); 25 } 26 27 /** 28 * 根据不同浏览器将文件名中的汉字转为UTF8编码的串,以便下载时能正确显示另存的文件名. 29 * 30 * @param s 31 * 原文件名 32 * @return 重新编码后的文件名 33 */ 34 public static String toUtf8String(HttpServletRequest request, String s) { 35 String agent = request.getHeader("User-Agent"); 36 try { 37 boolean isFireFox = (agent != null && agent.toLowerCase().indexOf("firefox") != -1); 38 if (isFireFox) { 39 s = new String(s.getBytes("UTF-8"), "ISO8859-1"); 40 } else { 41 s = StringUtil.toUtf8String(s); 42 if ((agent != null && agent.indexOf("MSIE") != -1)) { 43 // see http://support.microsoft.com/default.aspx?kbid=816868 44 if (s.length() > 150) { 45 // 根据request的locale 得出可能的编码 46 s = new String(s.getBytes("UTF-8"), "ISO8859-1"); 47 } 48 } 49 } 50 } catch (UnsupportedEncodingException e) { 51 e.printStackTrace(); 52 } 53 return s; 54 }