2010-03-04 85 views
0

我有一個struts2 web應用程序,它接受許多不同字符集中的POST和GET請求,將它們轉換爲utf-8,在屏幕上顯示正確的utf-8字符,然後將它們寫入utf-8數據庫。參數struts2中的字符集轉換

我已經嘗試了至少5種不同的方法來做簡單的無損字符集轉換的Windows-1250到utf-8開始,所有這些都不起作用。 Utf-8是「更大的一套」,它應該沒有問題(至少這是我的理解)。

你可以建議如何做一個從windows-1250到utf-8的字符集轉換嗎?struts2可能會用params charset做一些奇怪的事情,這可以解釋爲什麼我看起來無法正確。

這是我最新的嘗試:

String inputData = getSimpleParamValue("some_input_param_from_get"); 
    Charset inputCharset = Charset.forName("windows-1250"); 
    Charset utfCharset = Charset.forName("UTF-8"); 

    CharsetDecoder decoder = inputCharset.newDecoder(); 
    CharsetEncoder encoder = utfCharset.newEncoder(); 

    String decodedData = ""; 
    try { 
     ByteBuffer inputBytes = ByteBuffer.wrap(inputData.getBytes()); // I've tried putting UTF-8 here as well, with no luck 
     CharBuffer chars = decoder.decode(inputBytes); 

     ByteBuffer utfBytes = encoder.encode(chars); 
     decodedData = new String(utfBytes.array()); 

    } catch (CharacterCodingException e) { 
     logger.error(e); 
    } 

什麼任何想法設法得到這個工作?

謝謝你,最好的問候,

博佐

回答

0

我不知道您的方案。在Java中,一個字符串是Unicode,當必須將字符串轉換爲/從二進制表示轉換爲字符串時,纔會處理字符集轉換。 在你的例子中,當調用getSimpleParamValue(「some_input_param_from_get」)時,inputData應該已經有了「正確的」字符串,從字節流(從客戶端瀏覽器到Web服務器傳播)到字符串的轉換應該已經參與(應用程序的Web服務器+ Web層的響應)。 對於這一點,我強制UTF-8的網頁trasmission,將過濾器在web.xml(Struts的前),例如:

public class CharsetFilter implements Filter { 

    public void destroy() {} 

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { 
     HttpServletRequest req = (HttpServletRequest) request; 
     HttpServletResponse res = (HttpServletResponse) response; 
     req.setCharacterEncoding("UTF-8"); 

     chain.doFilter(req, res); 
     String contentType = res.getContentType(); 
     if(contentType !=null && contentType.startsWith("text/html")) 
      res.setCharacterEncoding("UTF-8"); 
    } 

    public void init(FilterConfig filterConfig) throws ServletException { 
    } 
} 

如果你不能做到這一點,如果你的getSimpleParamValue()「 Errs「在字符集轉換中(例如:它假定字節流是UTF-8並且是windows-1250),現在你有一個」不正確的「字符串,你必須嘗試通過撤消和重做字節到字符串來恢復它轉換 - 在這種情況下,你必須知道錯誤和正確的字符集 - 更糟的是,處理缺少字符的可能性(如果它被解釋爲UTF8,我可能已經發現非法字符序列)。 如果你必須在Struts2操作中處理這個問題,我會說你有問題,你應該在它之前/之後明確地處理它(在上層Web層 - 或者在數據庫驅動或文件編碼或其他)

+0

我得到HTTP參數中的字符集名稱,從這我現在必須知道如何轉換輸入參數(從Win1250到UTF-8)。 – bozo 2010-03-30 18:40:16

+0

順便說一句,我的網絡應用程序中有類似的過濾器,但這對我來說還不夠。所以現在我已經在Struts之前放置了一個PHP過濾器,它將源碼字符集中的iconv轉換爲UTF-8,並且完美地工作。我無法相信在Java中完成同樣的事情有多複雜 - 很難做到。 – bozo 2010-03-30 18:43:35