2011-10-15 37 views
0

我正在編寫一個jsp頁面,其中我想確定請求參數的字符編碼。這是我的代碼:使用org.mozilla.universalchardet.UniversalDetector的例外

String name= request.getParameter("hey"); 
UniversalDetector detector; 
try{ 
    detector = new UniversalDetector(null); //Exception is thrown here 

    detector.handleData(name.getBytes(), 0, name.length()); 
    detector.dataEnd(); 
    String encoding = "s";//detector.getDetectedCharset(); 
    if (encoding != null) { 
     out.println("Detected encoding = " + encoding); 
    } else { 
     out.println("No encoding detected."); 
    } 
    detector.reset(); 
}catch(Throwable e3) 
{ 
    out.print("Error: Jasper Exception >>"+e3.getMessage()+"<br>"); 
} 

在第二行(我提到)拋出異常。在捕捉印刷錯誤是:

Error: Jasper Exception >>org/mozilla/universalchardet/prober/CharsetProber 

我該怎麼辦?

回答

1

我自己得到了答案,我認爲把答案放在這裏很好。 Jasper異常被拋出,因爲它找不到org/mozilla/universalchardet/prober/CharsetProber類。

我注意到,我沒有對探測器文件夾複製到MyWebSite/WEB-INF /班/組織/ Mozilla瀏覽器/ universalchardet

我複製有文件夾的路徑,現在它的工作原理。

上傳:不幸的是我的主要問題繼續。它不能建議任何字符集,因爲字符串的長度不足以被識別爲特殊的字符集文本。

1

我不知道你爲什麼會得到這個例外。但可以肯定的是,你所要做的事情是行不通的。當您獲取請求的參數時,您將其作爲字符串獲取。這意味着Web容器已經將從HTTP請求收到的字節轉換爲字符串,因此已經使用了字符集編碼。

如果您在參數上調用getBytes(),則不會找到瀏覽器發送的字節。您將得到使用服務器的默認字符集將字符串重新編碼爲字節的結果。

您的代碼的另一個問題是異常處理:您捕獲構造函數拋出的異常,但仍然繼續使用檢測器,該檢測器由於異常而未創建。

也許你應該解釋你想做什麼以及爲什麼。你想這樣做。

+0

我編輯了我的問題,並解決了你所說的try/catch問題。我只想知道請求參數的編碼 – Saeed

+0

如果你閱讀我的答案,你會明白這是不可能的。您可以強制容器使用給定的編碼,儘管使用設置編碼的過濾器,但在讀取任何參數之前。閱讀http://java.sun.com/developer/technicalArticles/Intl/HTTPCharset/ –