2011-11-16 47 views
14

tôi hướng dẫn URL của tôi để gửi một yêu cầu Ajax như thế:UTF-8 URL Giải mã/mã hóa

url += '/' + something + '/' + id; 
var response; 
$.ajax({ 
    async : false, 
    type: 'DELETE', 
    url: url, 
... 

My removeId là một biến bao gồm tự UTF-8. Tôi sẽ xử lý biến đó ở bên cạnh Java như thế:

@RequestMapping(value = "/something/{id}", method = RequestMethod.DELETE) 
    public void myMethod(HttpServletResponse response, @PathVariable String id) { 
    ... 

Tuy nhiên id biến ở bên cạnh Java là khác biệt so với bản gốc của nó bởi vì UTF-8 ký tự thay đổi những điều kỳ lạ.

Làm cách nào để gửi các ký tự UTF-8 từ phía JavaScript và chuyển đổi nó một lần nữa ở phía Java của tôi (Spring 3 với REST, máy chủ web của tôi là Tomcat 7)?

PS 1: Thậm chí tôi không sử dụng encodeUriComponent có vẻ như URL của tôi đang tự mã hóa?

PS 2: Để làm cho câu hỏi rõ ràng hơn:

i.e. my id variable is araç and sent URL is: localhost:8080/sdfasf/ara%C3%A7 

Khi tôi thấy rằng biến id có giá trị:

araç 

thay vì:

ara%C3%A7 

Liệu Spring (hoặc Tomcat) tự động làm điều đó? Có cách nào để giải mã nó tự động khi nói để điều khiển như là một biến đường dẫn (tôi muốn nói mà không cần viết bất cứ điều gì như như:

URLDecoder.decode(id,"UTF-8"); 

nó sẽ được chuyển đổi tự động)

Trả lời

16

Giá trị id bạn thấy dường như được giải mã bằng bộ ký tự iso-8859-1 thay vì utf-8. Mã hóa phần đường dẫn của url không được chỉ định trong java EE và không có api chuẩn nào để đặt nó.Đối với tham số truy vấn, bạn có thể sử dụng request.setCharacterEncoding trước khi truy cập bất kỳ thông số nào để chúng có được giải mã chính xác. CharacterEncodingFilter thực hiện chính xác điều đó nhưng không ảnh hưởng đến các tham số đường dẫn.

Để thực hiện công việc này trong Tomcat, bạn phải đặt thuộc tính URIEncoding của phần tử Connector trong số server.xml thành "utf-8".

Tất cả những gì bạn muốn biết về mã hóa ký tự trong ứng dụng web java có thể được tìm thấy trong this excellent answer cho một câu hỏi tương tự.

+1

cảm ơn câu trả lời của bạn và bỏ phiếu. Tôi chỉ muốn chắc chắn. Tôi sử dụng Spring và đã cấu hình (không làm bất cứ điều gì với Tomcat) và tôi nghĩ rằng tôi đã giải quyết được vấn đề của mình. Tôi có bỏ lỡ một cái gì đó (tôi có nghĩa là có lẽ tôi đã không giải quyết vấn đề chính xác và một số nhân vật sẽ cung cấp cho lỗi quá?) Và có bất kỳ ví dụ về cách sử dụng request.setCharacterEncoding? – kamaci

+0

@kamaci: Tôi không nhận ra đó là câu trả lời của bạn và nó đã giải quyết được vấn đề của bạn khi tôi đăng câu trả lời của tôi. Việc gọi 'setCharacterEncoding' không hoạt động đối với các tham số đường dẫn với thùng chứa OC4j của oracle, có thể nó hoạt động với tomcat. Mặc dù mâu thuẫn với một số câu trả lời cho các câu hỏi tương tự như http://stackoverflow.com/questions/8079152/charset-filter-causing-issue-in-parsing-utf-8-characters/8079547#8079547 hoặc http://stackoverflow.com/câu hỏi/2630748/how-to-enable-reading-phi-ascii-characters-in-servlets/2630977 # 2630977 –

+0

cảm ơn câu trả lời chi tiết của bạn. – kamaci

1

Bạn đã cố gắng thiết lập mã hóa trang trên trang nơi bạn đang nhúng javascript?

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> 
1

Hãy chắc chắn rằng mã hóa trang được thiết lập để UTF-8 bằng cách thêm quyền này dưới bắt đầu <head> tag:

<meta charset="utf-8"> 

Ngoài ra hãy chắc chắn rằng file JavaScript được lưu với mã UTF-8. Kiểm tra cài đặt trình chỉnh sửa văn bản của bạn.

+0

Tôi có dòng tại HTML của tôi và biên tập viên của tôi tiết kiệm trang của tôi như là UTF-8. Tôi nghĩ rằng đó là một vấn đề về việc gửi một biến UTF-8 qua URL? – kamaci

+0

@kamaci 'console.log (url);' nói gì? –

+0

Biến id của tôi là 'araç' và URL là: http: // localhost: 8080/sdfasf/ara% C3% A7 – kamaci

0

Trong JavaScript sử dụng:

data=encodeURIComponent(data); 

cho dữ liệu mã hóa, và trong Java bạn có thể làm:

data=java.net.URLDecoder.decode(data); 
+0

Trong câu hỏi, id là một phần của đường dẫn yêu cầu để nó đã được giải mã bởi thùng chứa servlet. Ngoài ra, phương thức 'decode' sẽ được gọi với tham số thứ hai xác định bộ ký tự để sử dụng. –

3

Tôi tìm thấy câu trả lời ở đây: http://forum.springsource.org/showthread.php?14063-How-to-set-setCharacterEncoding-on-Request

tôi đã cấu hình mà ở tôi Mặt mùa xuân:

<filter> 
    <filter-name>SetCharacterEncodingFilter</filter-name> 
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> 
    <init-param> 
     <param-name>encoding</param-name> 
     <param-value>UTF8</param-value> 
    </init-param> 
    <init-param> 
     <param-name>forceEncoding</param-name> 
     <param-value>true</param-value> 
    </init-param> 
</filter> 
<filter-mapping> 
    <filter-name>SetCharacterEncodingFilter</filter-name> 
    <url-pattern>/*</url-pattern> 
</filter-mapping> 

và nó hoạt động tốt cho UTF-8.

-1

Không cần phải mã hóa chuỗi ở phía javascript. Java không hỗ trợ unicode để giải mã cần phải được thực hiện có như:

output = new String(input.getBytes("ISO-8859-1"), "UTF-8");

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