Tomcat 伺服器下 JSP 頁面中文問題解答

來源:互聯網
上載者:User

導讀:
  目前, Tomcat 作為一種出色的開放原始碼的 JSP 伺服器,目前在 JSP 的開發過程中獲得了廣泛的應用. 但是作為一款英語國家公司開發的軟體, 在中文環境下不可避免的會出現一些亂碼問題. 這裡就 Tomcat 4.0 和 Tomcat 4.1 下的常見中文問題及其解決方案做一個總結. 這些方法都已經在 中文版 Windows 98 + JDK 1.3.1 和 中文版 Windows 2000 + JDK 1.3.1 下通過了測試. 另外在 IBM 的網站上有一個網頁 http://www-900.ibm.com/developerWorks/cn/java/jsp_dbcsz/index.shtml 也討論了這個問題.
  首先為了便於討論, 這裡首先列出了一些方便的工具方法, 便於我們的討論. 這些方法如下所示:
  // 轉換由表單讀取的資料的內碼到 GB2312
  public String toChi(String input) {
  try {
  byte[] bytes = input.getBytes("ISO8859-1");
  return new String(bytes);
  }catch(Exception ex) {
  }
  return null;
  }
  
  // 對給定字元進行 URL 編碼
  public String encode(String value) {
  if(isEmpty(value)) return "";
  return java.net.URLEncoder.encode(value);
  }
  
  // 對給定字元進行 URL 解碼
  public String decode(String value) {
  if(isEmpty(value)) return "";
  return java.net.URLDecoder.decode(value);
  }
  
  問題1. 瀏覽器中看到的 JSP 頁面中的漢字怎麼都成了 '?' ?
  可能原因如下: 您的頁面中沒有指定頁面的字元集為中文. 解決方案(適用於Tomcat 4.0 和 Tomcat 4.1)是在頁面中添加如下代碼:
  
  
  問題2. 通過 POST 方法提交的表單的漢字都顯示為亂碼(在 Tomcat 4.0 下正常, Tomcat 4.1 下出現).
  可能原因如下: POST 提交的字串都是 ISO8859-1 編碼的, 只要把它的字元集轉換到中文就行了. 解決方案如下(適用於 Tomcat 4.1):
  // 單個的參數
  String result = toChi(request.getParameter("parameterName"));
  // 多個參數
  String values[] = request.getParameterValues(name);
  if(values != null) {
  for(int i = 0; i   values[i] = toChi(values[i]);
  }
  }
  問題3. 通過 GET 方法提交的表單的漢字都顯示為亂碼(在 Tomcat 4.0 和 Tomcat 4.1 下都出現).可能原因如下: GET 提交的字串都是 ISO8859-1 編碼的, 只要把它的字元集轉換到中文就行了. 解決方案如下(適用於 Tomcat 4.1, Tomcat 4.0 下不能用於 page.jsp?username=中文):
  // 單個的參數
  String result = toChi(request.getParameter("parameterName"));
  // 多個參數
  String values[] = request.getParameterValues(name);
  if(values != null) {
  for(int i = 0; i   values[i] = toChi(values[i]);
  }
  }
  問題4. Cookie 中不能寫入漢字或者漢字無法正確顯示.
  可能原因如下: Tomcat 4.0 下自動把 Cookie 做了編碼為 ISO8859-1 的儲存, 而 Tomcat 4.1 下的 JSP 引擎不支援包含含有漢字的 Cookie.
  Tomcat 4.0 下的解決方案:
  // 根據 Cookie 名稱得到請求中的 Cookie 值, 如果 Cookie 值是 null, 則返回 ""
  public String getCookieValue(HttpServletRequest request, String name) {
  Cookie[] cookies = request.getCookies();
  if(cookies == null) return "";
  for(int i = 0; i   Cookie cookie = cookies[i];
  if(cookie.getName().equals(name)) {
  // 需要對 Cookie 中的漢字進行 URL 反編碼, 適用版本: Tomcat 4.0
  return decode(cookie.getValue());
  }
  }
  // A cookie might not return a null value, may return a ""
  return "";
  }
  Tomcat 4.1 下的解決方案:
  // 寫入包含漢字 Cookie 的方法
  response.addCookie(new Cookie("cookieName", encode("漢字")));
  // 得到 Cookie 值的方法(同 Tomcat 4.0 的解決方案)
  public String getCookieValue(HttpServletRequest request, String name) {
  Cookie[] cookies = request.getCookies();
  if(cookies == null) return "";
  for(int i = 0; i   Cookie cookie = cookies[i];
  if(cookie.getName().equals(name)) {
  // 需要對 Cookie 中的漢字進行 URL 反編碼, 適用版本: Tomcat 4.0
  return decode(cookie.getValue());
  }
  }
  // A cookie might not return a null value, may return a ""
  return "";
  }
  問題5. 在 Tomcat 4.0 下 GET 請求(如: page.jsp?username=中文) 無法返回原來的值.
  原因: 與 Tomcat 引擎有關, 不論是否轉換內碼, 均無法返回原來的值, 但是有一個替代方法, 如下:
  將 URL 地址改變為 "page.jsp?username=" + encode("中文")

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.