2013-04-16 18 views
8

Tôi đang cố gắng gửi biểu mẫu có ký tự UTF8 bên trong nó. Biểu mẫu có dạng như sau:Mã hóa UTF-8 với biểu mẫu và Bộ điều khiển Xuân

<form id="workflowPersistForm" accept-charset="UTF-8" method="post" action="/workflow-next">> 
    <input id="stateGlobal" type="hidden" value=" お問い合わせ" name="state"> 
</form> 

Máy chủ của tôi dựa trên mùa xuân. Web.xml của tôi đã có Bộ lọc mã hóa:

<filter> 
    <filter-name>EncodingFilter</filter-name> 
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> 
    <init-param> 
     <param-name>encoding</param-name> 
     <param-value>UTF-8</param-value> 
    </init-param> 
    <init-param> 
     <param-name>forceEncoding</param-name> 
     <param-value>true</param-value> 
    </init-param> 
</filter> 

Vấn đề là các ký tự UTF-8 đang bị rối tung ở đâu đó. Tôi đặt một điểm phá vỡ ngay từ đầu của bộ điều khiển, và các nhân vật được điều sai lầm tại điểm đó chính nó. Ngoài ra, nếu tôi tạo các ký tự UTF8 bên trong Bộ điều khiển, nó sẽ được hiển thị chính xác trong trình duyệt. Chỉ cần trên bài đăng hình thức, bộ điều khiển không nhận được các ký tự đúng cách.

Bất kỳ ý tưởng nào tôi có thể làm sai?

Chỉnh sửa: Có vẻ như, trong dữ liệu trang mới không bị rối tung, nhưng mã hóa đôi của nó được mã hóa. Tôi không thể hiểu tại sao nó được mã hóa kép.

Chỉnh sửa 2: Khi tôi thay đổi biểu mẫu để thay vì đăng, mọi thứ hoạt động hoàn hảo. Tôi không biết bài viết nào đang bẻ khóa.

Trả lời

10

Hình như các trình duyệt không gửi charset như một phần của Content-Type trong tiêu đề yêu cầu (ngay cả khi chấp nhận-charset vào mẫu được thiết lập) và những giao dịch Tomcat với cơ thể của các yêu cầu như Latin-1 (http://wiki.apache.org/tomcat/FAQ/CharacterEncoding#Q1).

Vì vậy, tại thời điểm sau này, điều này có thể đã được giải mã là Latin-1 và được mã hóa dưới dạng UTF-8 dẫn đến các ký tự bị cắt xén.

Di chuyển CharacterEncodingFilter lên đầu và buộc mã hóa được đặt là UTF-8 đã giải quyết được sự cố.

+0

Nhiều vấn đề được liên kết, nhưng vấn đề thực sự là với thứ tự bộ lọc trong tệp web.xml –

1

Tôi khuyên bạn nên xóa ký tự CharacterEncodingFilter, điều này có thể là nguyên nhân của việc mã hóa kép.

Để gỡ lỗi situtation, trước tiên bạn nên kiểm tra xem trình duyệt có đang đăng dữ liệu chính xác hay không. Sử dụng Firebug (cho Firefox) hoặc các công cụ dành cho nhà phát triển trên Chrome (F12)

Rất có thể, sự cố ở phía máy chủ. Bạn sử dụng máy chủ nào? Nếu bạn sử dụng Tomcat, bạn cần phải thiết lập các CharsetEncoding sang UTF-8 trên các yếu tố kết nối trong server.xml

Cập nhật 1:

Nó trông rất có khả năng rằng vấn đề là forceEncoding rằng bạn đang thiết . Theo docs

Bộ lọc này có thể hoặc là áp dụng mã hóa nó nếu yêu cầu không đã chỉ định một mã hóa, hoặc thực thi mã hóa của bộ lọc này trong bất kỳ trường hợp ("forceEncoding" = "true")

Khi bạn nhận được, không có mã hóa được chỉ định, do đó, nó có ý nghĩa rằng nó hoạt động.

Tuy nhiên khi bạn làm POST, mã hóa đã được áp dụng và sau đó (có vẻ như) được áp dụng một lần nữa vì sự forceEncoding = true

+0

Tôi đã kiểm tra Firebug mọi thứ có vẻ ổn. Nếu tôi chỉ làm một yêu cầu nhận được thay vì đăng bài, tất cả mọi thứ hoạt động. – Bulbasaur

+0

xem câu trả lời cập nhật – arahant

+0

Không, bộ lọc này không thực sự mã hóa bất kỳ thứ gì, nó chỉ đặt mã hóa yêu cầu là UTF8. Mà thực sự là điều đúng để làm. – Bulbasaur

4

Bạn có một mục bộ lọc ánh xạ trong web.xml của bạn cho EncodingFilter ?

<filter-mapping> 
    <filter-name>EncodingFilter</filter-name> 
    <url-pattern>*</url-pattern> 
</filter-mapping> 
+0

Có, ánh xạ đã có sẵn. – Bulbasaur