2010-03-10 25 views
12

Một tập tin HTML đơn giản:Làm thế nào để buộc trình duyệt để thiết lập charset trong content-type tiêu đề http

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 

<html> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 
</head> 
<body> 
<form method="POST" action="test.jsp" accept-charset="utf-8" method="post" enctype="application/x-www-form-urlencoded" > 
    <input type="text" name="P"/> 
    <input type="submit" value="subMit"/> 
</form> 
</body> 
</html> 

Các tập tin HTML được phục vụ bởi các máy chủ sử dụng tiêu đề Content-Type:text/html; charset=utf-8. Tất cả mọi thứ nói: "trình duyệt thân yêu khi bạn gửi mẫu này, xin vui lòng gửi nó utf-8 mã hóa". Trình duyệt thực sự thực hiện điều này. Mọi giá trị được nhập trong trường nhập sẽ được mã hoá UTF-8. NHƯNG trình duyệt sẽ không nói điều này với máy chủ! Tiêu đề HTTP của yêu cầu bài đăng sẽ chứa trường Content-Type:application/x-www-form-urlencoded nhưng bộ ký tự sẽ bị bỏ qua (được thử nghiệm với FF3.6 và IE8).

Vấn đề là máy chủ ứng dụng tôi sử dụng (Tomcat6) dự kiến ​​bộ ký tự trong tiêu đề Kiểu nội dung (như đã nêu trong RFC2388). Như thế này: Content-Type:application/x-www-form-urlencoded;charset=utf-8. Nếu bộ ký tự bị bỏ qua, nó sẽ giả định ISO-8859-1 không phải bộ ký tự được sử dụng để mã hóa. Kết quả là dữ liệu bị hỏng.

Có một số người có manh mối về cách buộc trình duyệt hiện tại gắn thêm bộ ký tự vào tiêu đề Loại nội dung không?

+0

Tôi rơi chính xác cùng một vấn đề và tôi đã yêu cầu FF trên các nhóm google để tìm cách giải quyết vấn đề này http://groups.google.com/group/mozilla.dev.platform/browse_thread/thread/f3fd16b217a956c6 # –

Trả lời

11

Một số người có đầu mối cách buộc trình duyệt hiện tại gắn thêm bộ ký tự vào tiêu đề Loại nội dung không?

Không, không có trình duyệt nào cung cấp thông số charset với loại phương tiện application/x-www-form-urlencoded. Hơn nữa, thông số HTML xác định loại đó, không đề xuất tham số charset, vì vậy máy chủ không thể mong đợi một cách hợp lý để nhận được thông số đó.

(HTML4 không mong đợi một charset cho subparts của một trình multipart/form-data, nhưng ngay cả trong trường hợp đó không có trình duyệt thực sự tuân thủ.)

chấp nhận-charset = "utf-8"

accept-charset bị hỏng trong IE và không được sử dụng. Nó sẽ không tạo sự khác biệt theo cách cho các biểu mẫu trong các trang được phân phát dưới dạng UTF-8, nhưng trong các trường hợp khác, nó có thể kết thúc với các kết quả không phù hợp.

Không, với biểu mẫu bạn chỉ phải phân phát trang họ đang ở dưới dạng UTF-8 và kết quả sẽ trở lại dưới dạng UTF-8 (không có dấu nhận dạng để cho bạn biết) (ngoại trừ khả năng cho _charset_ hack, nhưng Tomcat không hỗ trợ điều đó)

Vì vậy, bạn phải báo cho bộ chứa Servlet biết mã hóa nào sẽ sử dụng cho các tham số nếu bạn không muốn nó trở về mặc định (thường là sai). thiết lập các trường hợp bạn có thể gọi ServletRequest.setCharacterEncoding() để làm điều này, nhưng điều này có xu hướng dễ vỡ và không hoạt động chút nào đối với các tham số được lấy từ chuỗi truy vấn. Không có bản sửa lỗi cấp Servlet được chuẩn hóa cho điều này, thật đáng buồn. Tomcat bạn thường phải muck about with the server.xml thay vì có thể sửa nó ứng dụng.

+1

Câu trả lời hay, kỳ vọng của phần Tomcat. 'ServletRequest # setCharacterEncoding()' thực sự đặt bộ ký tự được sử dụng để phân tích cú pháp yêu cầu ** body ** (nói cách khác: các tham số POST) và 'URIEncoding' trong' server.xml' thực sự đặt bộ ký tự được sử dụng để phân tích cú pháp yêu cầu ** URI ** (nói cách khác là: tham số GET).Vì anh ta đang sử dụng POST trong ví dụ của mình, chỉ cần sử dụng 'ServletRequest # setCharacterEncoding()' là đủ. Chi tiết hơn trong bài viết này: http://balusc.blogspot.com/2009/05/unicode-how-to-get-characters-right.html – BalusC

+0

Đủ rồi, nó chỉ có thể mong manh. Nếu bất kỳ tham số yêu cầu nào được đọc, nó sẽ làm cho phần thân yêu cầu được đọc và giải mã, sau đó bất kỳ lệnh gọi nào đến 'setCharacterEncoding' sẽ không hiệu quả. Thật dễ dàng cho một số thành phần trung gian lén lút làm rối tung mọi thứ bằng cách nhảy vào và đọc tham số ... – bobince

+0

bạn có nghĩa là "http spec" không phải "html spec", phải không? Trên thực tế, thông số http cho biết "Dữ liệu trong các bộ ký tự khác với 'ISO-8859-1' hoặc tập con của nó PHẢI được gắn nhãn bằng giá trị ký tự thích hợp." trong phần "Loại phương tiện 3.7": http://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.7 –

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