2011-08-05 25 views
0

我有一個輸入字段,用戶可以編寫任何需要的字段,包括國際lang字符。將內部字符從一個小服務器轉移到另一個小服務器時的問題

第一個servlet有;

protected void doWork(HttpServletRequest request, HttpServletResponse response) throws ServletException, 
     IOException { 
response.setContentType("text/html; charset=UTF-8"); 
PrintWriter out = new PrintWriter(new OutputStreamWriter(response.getOutputStream(), "UTF8"), true); 
out.println("<HTML><HEAD><TITLE>"); 
... 
out.println("<input type=text name=someText style='width:10em;'>"); 

該servlet繼續提交按鈕到第二個具有以下關鍵行的servlet;

if(httpRequest.getCharacterEncoding() == null) 
      httpRequest.setCharacterEncoding("UTF-8"); 
String someText= httpRequest.getParameter("someText"); 

我得到一些奇怪的名字:AAA°iÃüÃöÃçIı當我與調試進行。

我在做什麼錯了?

感謝您的幫助,

+0

您的'PrintWriter'方法笨拙。在獲得response.getWriter()之前,只需執行'response.setCharacterEncoding(「UTF-8」)* *。無需在'InputStreamReader'中包裝。另外,在servlet中發佈HTML是非常糟糕的做法。它應該在JSP中完成。另見http://stackoverflow.com/tags/servlets/info和http://balusc.blogspot.com/2009/05/unicode-how-to-get-characters-right.html。 – BalusC

回答

1

設置字符編碼成UTF直接與

httpRequest.setCharacterEncoding("UTF-8"); 

不需要檢查空,它永遠不會爲空。 Container/Appserver使用默認的ISO-8859-1進行設置。 這應該可以解決你的問題。

+0

你是對的,它從來沒有正確設置utf-8,但我也必須將該代碼行移到第二個servlet中的doWork。 我用來設置編碼,並在方法內部用utf-8做類似的東西。在做任何事情之前設置我需要設置的任何東西解決我的問題 謝謝大家。 btw MTilsted感謝您的建議,但該servlet沒有買它:) – mechanicum

+0

我將發佈到底是什麼意思5個小時後,顯然我無法回答我自己的帖子,因爲我沒有登錄 – mechanicum

-1

您可能需要接受-字符集= 'UTF-8' 添加到您的窗體: (喜歡的東西:

<form accept-charset='UTF-8' ... > 

重要提示:您應該只使用接收字符集= 'utf-8'如果你以uft-8的形式發送頁面,不要試圖用它來改變表單的編碼爲與頁面不同的東西(這在某些瀏覽器中是必需的,由於html標準中的混亂,他們更新的地方指定編碼用於提交表單)

並且在一個不相關的註釋中:請不要使用out.println來從servlet生成html輸出,這將不可能保持wh你混合代碼和HTML。使用諸如Velocity之類的工具來分離你的html和java。

http://velocity.apache.org - 你應該可以在一小時內啓動並運行)。

+0

在正常瀏覽器中不起作用。它僅適用於MSIE,即使如此,它也存在一個危險的錯誤。永遠不要使用'

'。 – BalusC

+0

但只有MSIE的越野車版本需要它。所有其他瀏覽器都知道他們應該使用與頁面相同的編碼發送回覆。因此,讓我補充一下:如果您以UTF-8格式提供頁面,請僅使用ACCEPT-CHARSET。較新的使用它來嘗試將編碼更改爲與您的頁面不同的內容。 – MTilsted

+0

而某些版本的Firefox也需要它。按照我的「重要注意事項」部分的規定使用應該是安全的。 – MTilsted

相關問題