我最近在開發時遇到了文件另存為時文件名出現亂碼,在火狐上正常的文件名,在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 }