重慶分公司,新征程啟航
為企業提供網站建設、域名注冊、服務器等服務
為企業提供網站建設、域名注冊、服務器等服務
HSSFWorkbook workbook = new HSSFWorkbook();//創建EXCEL文件
鄂倫春網站制作公司哪家好,找成都創新互聯!從網頁設計、網站建設、微信開發、APP開發、響應式網站設計等網站項目制作,到程序開發,運營維護。成都創新互聯自2013年起到現在10年的時間,我們擁有了豐富的建站經驗和運維經驗,來保證我們的工作的順利進行。專注于網站建設就選成都創新互聯。
HSSFSheet sheet= workbook.createSheet(sheetName); //創建工作表
這樣在用英文名作為工作表名是沒問題的,但如果sheetName是中文字符,就會出現亂碼,解決的方法如下代碼:
HSSFSheet sheet= workbook.createSheet();
workbook.setSheetName(0, sheetName,(short)1); //這里(short)1是解決中文亂碼的關鍵;而第一個參數是工作表的索引號。
沒有太多原因,POI就是如此;再說導出的EXCEL文件名的中文亂碼問題, 導出時代碼如下:
.....
this.getResponse().reset();
this.getResponse().setContentType("application/msexcel");
this.getResponse().setHeader("Content-Disposition", "inline;filename=中文名.xls");
try {
em.getExcelMutliIO(this.getResponse().getOutputStream());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
這個時候導出去時,文件名會為亂碼,解決的辦法如下,在你的代碼增加下列函數:
public static String toUtf8String (String s){
StringBuffer sb = new StringBuffer();
for (int i=0;is.length();i++){
char c = s.charAt(i);
if (c = 0 c = 255){sb.append(c);}
else{
byte[] b;
try { b = Character.toString(c).getBytes("utf-8");}
catch (Exception ex) {
System.out.println(ex);
b = new byte[0];
}
for (int j = 0; j b.length; j++) {
int k = b[j];
if (k 0) k += 256;
sb.append("%" + Integer.toHexString(k).toUpperCase());
}
}
}
return sb.toString();
}
然后在導出時,對文件名引用該函數,代碼如下:
this.getResponse().setHeader("Content-Disposition", "inline;filename=" +toUtf8String("中文文件名.xls"));
對于Java,由于默認的編碼方式是UNICODE,所以用中文也易出問題,常見的解決是:
String s2 = new String(s1.getBytes(“ISO-8859-1”),”GBK”);
1、utf8解決JSP中文亂碼問題
一般說來在每個頁面的開始處,加入:
%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%
%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%
%
request.setCharacterEncoding("UTF-8");
%
◆charset=UTF-8的作用是指定JSP向客戶端輸出的編碼方式為“UTF-8”;
◆pageEncoding="UTF-8",為了讓JSP引擎能正確地解碼含有中文字符的JSP頁面,這在LINUX中很有效;
◆request.setCharacterEncoding("UTF-8");是對請求進行了中文編碼。
有時,這樣仍不能解決問題,還需要這樣處理一下:
String msg = request.getParameter("message");
String str=new String(msg.getBytes("ISO-8859-1"),"UTF-8");
out.println(st);
亂碼的話,分為幾個位置的亂碼。
一、是JSP頁面亂碼問題,
解決方式:%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%
二、后臺向前端傳輸字符串的的亂碼
解決方式: response.setContentType("text/html;charset=UTF-8");
response.setCharacterEncoding("UTF-8");
三、Ajax異步傳參時的亂碼問題
解決方法:contentType:"application/x-www-form-urlencoded; charset=utf-8",
四、myEclips或Eclips打開文件時亂碼
解決方法:右鍵該文件-porperties-把該文件調為UTF-8的格式
純手寫,請給采納
解決亂碼問題:可以修改eclipse里的編碼格式來解決亂碼問題:
1、window-- Preference
2、點擊General--Workspace,在右面的窗體找到“Text file encoding”,就可以修改編碼格式了
要明白,用filewriter讀取文件采取的是平臺默認編碼(視操作系統而定)。當要寫入的文本文件編碼和平臺默認編碼不一致時,就會出現中文亂碼的情況。這時可以使用filewriter 的父類OutputStreamWriter來讀取。OutputStreamWriter允許用戶指定編碼方式,代碼為:
FileInputStream fis=new FileInputStream("文件路徑");
OutputStreamWriter osw=new OutputStreamWriter(fis,"文本文件的編碼方式(ANSI,UTF-8...)");
osw.write();
這樣寫入的編碼可以保證和源文本文件編碼一致,就不會出現亂碼了。
1. 網絡爬蟲亂碼的原因。
源網頁的編碼與抓取后的編碼轉換不一致。如果源網頁是gbk編碼的字節流,程序在我們抓取后直接用utf-8編碼輸出到存儲文件,這必然會造成亂碼,即當源網頁編碼與程序抓取后直接處理編碼一致時,就不會出現亂碼,然后統一字符編碼后也就不會出現亂碼。注意區分源網絡代碼A,程序B直接使用的代碼,統一轉換字符的代碼C。
2. 是網頁的服務器端代碼。
B.捕獲的數據原本是字節數組,由A編碼,只有B=A才能保證不會出現亂碼;否則,當字符集不兼容時,就會出現亂碼字符。這一步常用于測試。
c、統一轉碼是指在獲得網頁的原始編碼A后進行統一編碼,主要是將每個網頁的數據統一成一種編碼,往往首選字符集較大的utf-8。
每個網頁都有自己的代碼,比如gbk,utf-8,iso8859-1,日本jp系統代碼,西歐,俄語等等。爬行時,所有類型的代碼都將被擴展。有的爬蟲只是簡單的識別網頁,然后統一編碼,有的則直接按照utf-8統一處理,不需要判斷源網頁,顯然會造成亂碼。
3. 亂碼的解決方案。
根據原因找到解決辦法很簡單。
1) 確定源網頁的代碼a。
代碼a通常位于網頁的三個位置,即httpheader的內容、網頁的元字符集和網頁標題中的文檔定義。獲取源網頁代碼時,依次判斷這三部分數據,從頭到尾優先級相同。
理論上這是對的,但是國內有些網站不符合標準。比如寫出來的gbk其實是utf-8,有的寫出來是utf-8,其實是gbk。當然這是幾個網站,但是確實存在。因此,在確定網頁編碼時,應該對這種特殊情況給予特殊處理,如中文檢查、默認編碼等策略。
在另一種情況下,如果以上三種都沒有編碼信息,一般使用第三方的網頁編碼智能識別工具,如cpdetector。原理是通過統計字節數組的特性來計算實際編碼,有一定的準確率,但是我發現在實踐中準確率還是很有限的。
但是綜合以上三種編碼確認方法后,中文亂碼的問題幾乎可以完全解決。在我的基于nutch1.6的網絡爬蟲系統中,經過統計,編碼準確率可以達到99.99%,這也證明了上述方法和策略的可行性。
2) 程序通過代碼b還原源網頁數據。
顯然,這里的B應該等于a,在java中,如果源網頁的字節數組是source_byte_array,就會轉換成stringstr=newstring(source_byte_array,B)。即這些字節數組對應的字符被正確編碼顯示在內存中,此時打印結果正常。此步驟通常用于調試或控制臺輸出測試。
3) 統一轉碼。
網絡爬蟲系統中有很多數據源。如果無法使用數據,它將被轉換為其原始數據,如果這樣做是浪費的。所以一般爬蟲系統要對抓取的結果進行統一編碼,做到一致,使用方便。此時,在(2)的基礎上,可以進行統一的編碼轉換,在java中的實現如下。
源網頁的字節數組是source_byte_array。
轉換為普通字符串:stringnormal_source_str=newstring(source_byte_array,c)。這時候可以直接用javaapi存儲,但是字符串往往不直接寫。因為一般爬蟲存儲是將多個源網頁存儲在一個文件中,所以要記錄字節偏移量,所以下一步。 再將得到的str轉換為統一的編碼C格式的字節數組,則byte[] new_byte_array=normal_source_str.getBytes(C)即可,此時即可用java io api將數組寫入文件,并記錄相應的字節數組偏移量等,待真正使用時,直接io讀取即可。
爬蟲過程不僅會存在亂碼問題,還會存在網站爬取涉及法律、IP受限,爬取行為受限等等問題,這個時候就需要不斷去解決這些問題。