2012-06-07 38 views
5

Tôi đang phát triển một ứng dụng web đơn giản bằng cách sử dụng java/jsp/tomcat/mysql, và vấn đề nhất nằm trên bảng mã ký tự vì tôi cần xử lý mã hóa UTF-8 thay vì 8851 mặc địnhjava tomcat utf-8 mã hóa vấn đề

Trước tiên tôi muốn mô tả cấu trúc chương trình của mình. Tôi đang sử dụng một Servlet gọi là Controller.java để xử lý tất cả các yêu cầu. Vì vậy, trong web.xml, tôi có một bộ điều khiển servlet nhận tất cả yêu cầu từ * .do.

Sau đó, Bộ điều khiển này sẽ gửi yêu cầu dựa trên URL được yêu cầu, ví dụ, nếu máy khách yêu cầu register.do, Controller sẽ gửi yêu cầu đến Register.java.

Và trong Register.java, có một phương pháp mà có yêu cầu như tham số, cụ thể là:

public String perform(HttpServletRequest request) { 
    do something with the request... 
} 

Vì vậy, vấn đề là nếu tôi muốn in một cái gì đó trong UTF-8 trong phương pháp này, nó sẽ cung cấp các ký tự ngẫu nhiên. Ví dụ, tôi có một Enum lưu trữ một số hằng số, một trong những thuộc tính mà Enum có là tên của nó trong tiếng Trung Phồn thể. Nếu tôi in nó trong

public static void main(Stirng[] args{ 
    System.out.println(MyEnum.One.getChn()); 
    logger.info(MyEnum.One.getChn()); 
} 

Điều này được in chính xác bằng tiếng Trung. Tuy nhiên, nếu tôi đặt mã chính xác bên trong phương pháp đối phó với HttpServletRequest:

public String perform(HttpServletRequest request) { 
    System.out.println(MyEnum.One.getChn()); 
    logger.info(MyEnum.One.getChn()); 
} 

Chúng được in như ký tự ngẫu nhiên, nhưng tôi có thể nhìn thấy từ cửa sổ gỡ lỗi (eclipse) mà các biến được giữ ký tự đúng của Trung Quốc.

Vì vậy, tình huống tương tự xảy ra khi tôi muốn lưu trữ giá trị từ request.getParameter(). Trong cửa sổ gỡ lỗi, tôi có thể thấy biến đang giữ các ký tự chính xác, nhưng tôi in ra hoặc cố gắng lưu nó trong cơ sở dữ liệu, nó là ký tự ngẫu nhiên.

Tôi không biết tại sao hành vi này hoạt động như thế này và điều này ngăn tôi đọc các giá trị biểu mẫu đã gửi và lưu trữ chúng vào cơ sở dữ liệu. Ai đó có thể đưa ra một số gợi ý về điều này?

Xin cảm ơn.

+1

Tôi không thể hiểu cho dù bạn đang lo lắng về đầu ra hỏng trên giao diện điều khiển và các bản ghi của máy chủ, * hoặc * hỏng sản lượng trong phản hồi kết quả cho trình duyệt. Bạn có thể làm rõ? – erickson

+2

Giá trị của 'System.getProperty (" file.encoding ")' là gì? – erickson

+0

Điều tôi lo lắng là trong cửa sổ gỡ lỗi tôi có thể thấy mã hóa chính xác, nhưng khi tôi chuyển biến cho đối tượng truy cập cơ sở dữ liệu của tôi và lưu nó vào db, nó sẽ trở thành ký tự ngẫu nhiên. Vì vậy, sau đó tôi thấy rằng trong phương pháp xử lý các yêu cầu, thậm chí chỉ cần in ra giá trị Enf UTF-8 không hoạt động. –

Trả lời

5

Nếu bạn cần phải sử dụng mã UTF-8 (và thực sự, tất cả mọi người nên đi này những ngày này), sau đó bạn có thể làm theo các "UTF-8 ở khắp mọi nơi HOWTO" được tìm thấy trong FAQ Tomcat:

http://wiki.apache.org/tomcat/FAQ/CharacterEncoding#Q8

Hãy nhớ rằng bạn cũng cần hỗ trợ UTF-8 trong các trường văn bản của cơ sở dữ liệu của bạn.

Cũng nên nhớ rằng đôi khi "in" một chuỗi với các ký tự khác ASCII trong nó vào một file log hoặc giao diện điều khiển có thể bị ảnh hưởng bởi

  1. Mã hóa ký tự của dòng đầu ra
  2. Mã hóa ký tự của người đọc tập tin (ví dụ như mèo/ít/vi)
  3. mã hóa ký tự của nhà ga

Bạn có thể được tốt hơn bằng văn bản cho giá trị vào một tập tin và sau đó sử dụng một edi hex tor để kiểm tra các nội dung để chắc chắn rằng bạn đang nhận được các giá trị byte bạn đang tìm kiếm.

+0

UTF-8 ở mọi nơi trong Eclipse: [Unicode/UTF-8 trong các dự án Java Eclipse của bạn] (http://stijndewitt.wordpress.com/2010/05/05/unicode-utf-8-in-eclipse-java/) –

8

Đây là một hướng dẫn nhỏ những gì bạn cần làm để làm cho UTF-8 làm việc trong ứng dụng web của bạn:

Bạn phải thực hiện lọc trong ứng dụng của bạn để mã hóa ký tự:

public class CharacterEncodingFilter implements Filter { 

    @Override 
    public void init(FilterConfig filterConfig) 
      throws ServletException { 

    } 

    @Override 
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) 
      throws IOException, ServletException { 
     servletRequest.setCharacterEncoding("UTF-8"); 
     servletResponse.setContentType("text/html; charset=UTF-8"); 
     filterChain.doFilter(servletRequest, servletResponse); 
    } 

    @Override 
    public void destroy() { 

    } 
} 

Bạn có để đảm bảo rằng phần tử trình kết nối tệp của máy chủ tomcat của bạn có thuộc tính URIEncoding có giá trị là UTF-8.

<Connector port="8080" 
      protocol="HTTP/1.1" 
      connectionTimeout="20000" 
      URIEncoding="UTF-8" 
      redirectPort="8443"/> 

Ngoài ra, bạn cần phải xác định này trong mỗi trang JSP:

<%@page contentType="text/html" pageEncoding="UTF-8"%> 
+1

Trên thực tế, thay vì bộ lọc, tôi nghĩ bạn có thể đặt điều này trong JSP của bạn: '<% @ page language =" java "contentType =" text/html; charset = UTF-8 "pageEncoding =" UTF-8 "%> ' –

Các vấn đề liên quan