HSSFWorkbook workbook = new HSSFWorkbook();//創(chuàng)建EXCEL文件

鄂倫春網(wǎng)站制作公司哪家好,找成都創(chuàng)新互聯(lián)!從網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站建設(shè)、微信開(kāi)發(fā)、APP開(kāi)發(fā)、響應(yīng)式網(wǎng)站設(shè)計(jì)等網(wǎng)站項(xiàng)目制作,到程序開(kāi)發(fā),運(yùn)營(yíng)維護(hù)。成都創(chuàng)新互聯(lián)自2013年起到現(xiàn)在10年的時(shí)間,我們擁有了豐富的建站經(jīng)驗(yàn)和運(yùn)維經(jīng)驗(yàn),來(lái)保證我們的工作的順利進(jìn)行。專注于網(wǎng)站建設(shè)就選成都創(chuàng)新互聯(lián)。
HSSFSheet sheet= workbook.createSheet(sheetName); //創(chuàng)建工作表
這樣在用英文名作為工作表名是沒(méi)問(wèn)題的,但如果sheetName是中文字符,就會(huì)出現(xiàn)亂碼,解決的方法如下代碼:
HSSFSheet sheet= workbook.createSheet();
workbook.setSheetName(0, sheetName,(short)1); //這里(short)1是解決中文亂碼的關(guān)鍵;而第一個(gè)參數(shù)是工作表的索引號(hào)。
沒(méi)有太多原因,POI就是如此;再說(shuō)導(dǎo)出的EXCEL文件名的中文亂碼問(wèn)題, 導(dǎo)出時(shí)代碼如下:
.....
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();
}
這個(gè)時(shí)候?qū)С鋈r(shí),文件名會(huì)為亂碼,解決的辦法如下,在你的代碼增加下列函數(shù):
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();
}
然后在導(dǎo)出時(shí),對(duì)文件名引用該函數(shù),代碼如下:
this.getResponse().setHeader("Content-Disposition", "inline;filename=" +toUtf8String("中文文件名.xls"));
對(duì)于Java,由于默認(rèn)的編碼方式是UNICODE,所以用中文也易出問(wèn)題,常見(jiàn)的解決是:
String s2 = new String(s1.getBytes(“ISO-8859-1”),”GBK”);
1、utf8解決JSP中文亂碼問(wèn)題
一般說(shuō)來(lái)在每個(gè)頁(yè)面的開(kāi)始處,加入:
%@ 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頁(yè)面,這在LINUX中很有效;
◆request.setCharacterEncoding("UTF-8");是對(duì)請(qǐng)求進(jìn)行了中文編碼。
有時(shí),這樣仍不能解決問(wèn)題,還需要這樣處理一下:
String msg = request.getParameter("message");
String str=new String(msg.getBytes("ISO-8859-1"),"UTF-8");
out.println(st);
亂碼的話,分為幾個(gè)位置的亂碼。
一、是JSP頁(yè)面亂碼問(wèn)題,
解決方式:%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%
二、后臺(tái)向前端傳輸字符串的的亂碼
解決方式: response.setContentType("text/html;charset=UTF-8");
response.setCharacterEncoding("UTF-8");
三、Ajax異步傳參時(shí)的亂碼問(wèn)題
解決方法:contentType:"application/x-www-form-urlencoded; charset=utf-8",
四、myEclips或Eclips打開(kāi)文件時(shí)亂碼
解決方法:右鍵該文件-porperties-把該文件調(diào)為UTF-8的格式
純手寫,請(qǐng)給采納
解決亂碼問(wèn)題:可以修改eclipse里的編碼格式來(lái)解決亂碼問(wèn)題:
1、window-- Preference
2、點(diǎn)擊General--Workspace,在右面的窗體找到“Text file encoding”,就可以修改編碼格式了
要明白,用filewriter讀取文件采取的是平臺(tái)默認(rèn)編碼(視操作系統(tǒng)而定)。當(dāng)要寫入的文本文件編碼和平臺(tái)默認(rèn)編碼不一致時(shí),就會(huì)出現(xiàn)中文亂碼的情況。這時(shí)可以使用filewriter 的父類OutputStreamWriter來(lái)讀取。OutputStreamWriter允許用戶指定編碼方式,代碼為:
FileInputStream fis=new FileInputStream("文件路徑");
OutputStreamWriter osw=new OutputStreamWriter(fis,"文本文件的編碼方式(ANSI,UTF-8...)");
osw.write();
這樣寫入的編碼可以保證和源文本文件編碼一致,就不會(huì)出現(xiàn)亂碼了。
1. 網(wǎng)絡(luò)爬蟲亂碼的原因。
源網(wǎng)頁(yè)的編碼與抓取后的編碼轉(zhuǎn)換不一致。如果源網(wǎng)頁(yè)是gbk編碼的字節(jié)流,程序在我們抓取后直接用utf-8編碼輸出到存儲(chǔ)文件,這必然會(huì)造成亂碼,即當(dāng)源網(wǎng)頁(yè)編碼與程序抓取后直接處理編碼一致時(shí),就不會(huì)出現(xiàn)亂碼,然后統(tǒng)一字符編碼后也就不會(huì)出現(xiàn)亂碼。注意區(qū)分源網(wǎng)絡(luò)代碼A,程序B直接使用的代碼,統(tǒng)一轉(zhuǎn)換字符的代碼C。
2. 是網(wǎng)頁(yè)的服務(wù)器端代碼。
B.捕獲的數(shù)據(jù)原本是字節(jié)數(shù)組,由A編碼,只有B=A才能保證不會(huì)出現(xiàn)亂碼;否則,當(dāng)字符集不兼容時(shí),就會(huì)出現(xiàn)亂碼字符。這一步常用于測(cè)試。
c、統(tǒng)一轉(zhuǎn)碼是指在獲得網(wǎng)頁(yè)的原始編碼A后進(jìn)行統(tǒng)一編碼,主要是將每個(gè)網(wǎng)頁(yè)的數(shù)據(jù)統(tǒng)一成一種編碼,往往首選字符集較大的utf-8。
每個(gè)網(wǎng)頁(yè)都有自己的代碼,比如gbk,utf-8,iso8859-1,日本jp系統(tǒng)代碼,西歐,俄語(yǔ)等等。爬行時(shí),所有類型的代碼都將被擴(kuò)展。有的爬蟲只是簡(jiǎn)單的識(shí)別網(wǎng)頁(yè),然后統(tǒng)一編碼,有的則直接按照utf-8統(tǒng)一處理,不需要判斷源網(wǎng)頁(yè),顯然會(huì)造成亂碼。
3. 亂碼的解決方案。
根據(jù)原因找到解決辦法很簡(jiǎn)單。
1) 確定源網(wǎng)頁(yè)的代碼a。
代碼a通常位于網(wǎng)頁(yè)的三個(gè)位置,即httpheader的內(nèi)容、網(wǎng)頁(yè)的元字符集和網(wǎng)頁(yè)標(biāo)題中的文檔定義。獲取源網(wǎng)頁(yè)代碼時(shí),依次判斷這三部分?jǐn)?shù)據(jù),從頭到尾優(yōu)先級(jí)相同。
理論上這是對(duì)的,但是國(guó)內(nèi)有些網(wǎng)站不符合標(biāo)準(zhǔn)。比如寫出來(lái)的gbk其實(shí)是utf-8,有的寫出來(lái)是utf-8,其實(shí)是gbk。當(dāng)然這是幾個(gè)網(wǎng)站,但是確實(shí)存在。因此,在確定網(wǎng)頁(yè)編碼時(shí),應(yīng)該對(duì)這種特殊情況給予特殊處理,如中文檢查、默認(rèn)編碼等策略。
在另一種情況下,如果以上三種都沒(méi)有編碼信息,一般使用第三方的網(wǎng)頁(yè)編碼智能識(shí)別工具,如cpdetector。原理是通過(guò)統(tǒng)計(jì)字節(jié)數(shù)組的特性來(lái)計(jì)算實(shí)際編碼,有一定的準(zhǔn)確率,但是我發(fā)現(xiàn)在實(shí)踐中準(zhǔn)確率還是很有限的。
但是綜合以上三種編碼確認(rèn)方法后,中文亂碼的問(wèn)題幾乎可以完全解決。在我的基于nutch1.6的網(wǎng)絡(luò)爬蟲系統(tǒng)中,經(jīng)過(guò)統(tǒng)計(jì),編碼準(zhǔn)確率可以達(dá)到99.99%,這也證明了上述方法和策略的可行性。
2) 程序通過(guò)代碼b還原源網(wǎng)頁(yè)數(shù)據(jù)。
顯然,這里的B應(yīng)該等于a,在java中,如果源網(wǎng)頁(yè)的字節(jié)數(shù)組是source_byte_array,就會(huì)轉(zhuǎn)換成stringstr=newstring(source_byte_array,B)。即這些字節(jié)數(shù)組對(duì)應(yīng)的字符被正確編碼顯示在內(nèi)存中,此時(shí)打印結(jié)果正常。此步驟通常用于調(diào)試或控制臺(tái)輸出測(cè)試。
3) 統(tǒng)一轉(zhuǎn)碼。
網(wǎng)絡(luò)爬蟲系統(tǒng)中有很多數(shù)據(jù)源。如果無(wú)法使用數(shù)據(jù),它將被轉(zhuǎn)換為其原始數(shù)據(jù),如果這樣做是浪費(fèi)的。所以一般爬蟲系統(tǒng)要對(duì)抓取的結(jié)果進(jìn)行統(tǒng)一編碼,做到一致,使用方便。此時(shí),在(2)的基礎(chǔ)上,可以進(jìn)行統(tǒng)一的編碼轉(zhuǎn)換,在java中的實(shí)現(xiàn)如下。
源網(wǎng)頁(yè)的字節(jié)數(shù)組是source_byte_array。
轉(zhuǎn)換為普通字符串:stringnormal_source_str=newstring(source_byte_array,c)。這時(shí)候可以直接用javaapi存儲(chǔ),但是字符串往往不直接寫。因?yàn)橐话闩老x存儲(chǔ)是將多個(gè)源網(wǎng)頁(yè)存儲(chǔ)在一個(gè)文件中,所以要記錄字節(jié)偏移量,所以下一步。 再將得到的str轉(zhuǎn)換為統(tǒng)一的編碼C格式的字節(jié)數(shù)組,則byte[] new_byte_array=normal_source_str.getBytes(C)即可,此時(shí)即可用java io api將數(shù)組寫入文件,并記錄相應(yīng)的字節(jié)數(shù)組偏移量等,待真正使用時(shí),直接io讀取即可。
爬蟲過(guò)程不僅會(huì)存在亂碼問(wèn)題,還會(huì)存在網(wǎng)站爬取涉及法律、IP受限,爬取行為受限等等問(wèn)題,這個(gè)時(shí)候就需要不斷去解決這些問(wèn)題。
分享文章:java解決亂碼的代碼,java解決亂碼的代碼是什么
網(wǎng)站URL:http://chinadenli.net/article39/dsgopph.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供自適應(yīng)網(wǎng)站、網(wǎng)站策劃、ChatGPT、網(wǎng)站設(shè)計(jì)公司、虛擬主機(jī)、定制開(kāi)發(fā)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)