2013-08-15 40 views
28

Các thoát() chức năng, đã phản đối và thay thế bằng encodeURIComponent nhưng encodeURIComponent không mã hóa đơn nhân vật báo/dấu nháy đơn. Tôi cần phải thoát khỏi các dấu nháy đơn trong họ của một người (ví dụ: 'O'Neill') dưới dạng AJAX. Tại sao họ sẽ loại bỏ khả năng của một cái gì đó mà họ đang cố gắng cải thiện?Tại sao encodeURIComponent không mã hóa dấu nháy đơn/dấu nháy đơn?

EDIT:

Vì vậy, đây là ví dụ về mã để giải thích vấn đề kỹ lưỡng hơn. Vì vậy, như bạn có thể thấy họ 'O'Neill' chứa một dấu nháy đơn cần phải được thoát khi chuyển biến trong url. Nhưng điều này cũng sẽ xảy ra ở những nơi khác trong biểu mẫu, ví dụ nếu một địa chỉ được nhập là 'Billy's Tavern'.

<input id='surname' value="O'Neill">       
<script> 
var get_url = '?surname='+encodeURIComponent($('#surname').val()); 
$.ajax({ 
    url: get_url 
}); 
</script> 

Giải pháp hiện tại của tôi, sử dụng chức năng tùy chỉnh. Câu hỏi của tôi chỉ là hỏi tại sao có nhu cầu cho một chức năng tùy chỉnh.

<script> 
function customEncodeURIComponent(URI) { 
    return encodeURIComponent(URI).replace(/'/g, "%27"); 
} 
</script> 

<input id='surname' value="O'Neill"> 
<script> 
var get_url = '?surname='+customEncodeURIComponent($('#surname').val()); 
$.ajax({ 
    url: get_url 
}); 
</script> 
+2

Tại sao bạn cần thoát khỏi dấu nháy đơn? Nếu nhu cầu cụ thể của bạn chỉ là vậy, chỉ cần thay thế. –

+3

Những gì họ cần phải được thoát cho? – Bergi

+5

'encodeURIComponent' không mã hóa' ''ký tự bởi vì'' 'ký tự không cần phải được mã hóa trong URI. – Quentin

Trả lời

38

encodeURIComponent thoát tất cả các nhân vật ngoại trừ như sau:

chữ cái, chữ số thập phân , - _. ! ~ * '()

Nếu bạn muốn sử dụng một mã hóa tương thích với RFC 3986 (trong đó có toàn !, ', (, ), và *), bạn có thể sử dụng:

function rfc3986EncodeURIComponent (str) { 
    return encodeURIComponent(str).replace(/[!'()*]/g, escape); 
} 

Bạn có thể có thêm thông tin về số điện thoại on MDN này.

UPDATE:

Để trả lời câu hỏi của bạn, tại sao ' và các ký tự khác được đề cập ở trên không được mã hóa bởi encodeURIComponent, câu trả lời ngắn gọn là họ chỉ cần được mã hóa trong các chương trình URI nhất định và quyết định để mã hóa chúng phụ thuộc vào lược đồ bạn đang sử dụng.

Để báo RFC 3986:

URI ứng dụng sản xuất nên phần trăm mã hóa octet dữ liệu mà tương ứng với nhân vật trong reserved set trừ khi những nhân vật được phép đặc biệt bởi các URI scheme để đại diện cho dữ liệu trong đó thành phần. Nếu một ký tự dành riêng được tìm thấy trong thành phần URI và không có vai trò phân định được biết cho ký tự đó, thì phải là được hiểu là biểu thị octet dữ liệu tương ứng với mã hóa của ký tự trong US-ASCII.

đâu "bộ dành riêng" được định nghĩa là

reserved = gen-delims/sub-delims 
gen-delims = ":"/"/"/"?"/"#"/"["/"]"/"@" 
sub-delims = "!"/"$"/"&"/"'"/"("/")" 
      /"*"/"+"/","/";"/"=" 

Apostrophe là trong nhóm sub-delims. Nói cách khác, bạn phải để các ký tự này không được mã hóa đặc biệt nếu bạn chắc chắn rằng các ứng dụng tiêu thụ sẽ biết phải làm gì với chúng: ví dụ nếu bạn mã hóa nhầm ?& chúng sẽ không còn phân định các phần truy vấn nữa. Trong lịch sử cũng có đề xuất cho các thông số phân khúc đường dẫn được phân tách bằng ;, (không nhận được sự chấp nhận lớn), vì vậy các ký tự này cũng vẫn được phép. Nó không phải là apostrohe đó là "tự do sử dụng" (tức là unreserved) trong dữ liệu URI, nhưng điều đó nó được giả định nó sẽ có một số ý nghĩa đặc biệt trong bối cảnh URI, ví dụ như segment phần:

segment  = *pchar 
pchar   = unreserved/pct-encoded/sub-delims/":"/"@" 
unreserved = ALPHA/DIGIT/"-"/"."/"_"/"~" 
+0

Tôi đã chỉnh sửa bài đăng của mình để hiển thị chức năng tùy chỉnh hiện tại của tôi, nó không triệt để như bạn nhưng sử dụng cùng một ý tưởng. Cảm ơn vì đã trả lời. –

+1

vấn đề duy nhất với cách tiếp cận thoát là dấu hoa thị không được mã hóa. Điều này dường như làm việc: encodeURIComponent (str) .replace (/ [! '() *]/G, hàm (c) {return'% '+ c.charCodeAt (0) .toString (16) .toUpperCase(); }); –

+0

Nửa chừng trang này là một ví dụ sao chép-dán-sẵn sàng khác của chức năng mã hóa RFC3986: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/encodeURIComponent – mvdb

4

thử

encodeURIComponent(str).replace(/'/g, "%27"); 

Cú pháp /char/g này cho hoạt Javascript để thay thế tất cả các lần xuất hiện trong chuỗi của bạn

+2

Tôi không biết * bất kỳ * ngôn ngữ nào sử dụng '/' làm ký tự thoát ... và câu hỏi đang tìm kiếm cách để thoát khỏi ký tự một cách có lập trình, không phải theo cách thủ công. – Quentin

+0

đó là lỗi đánh máy và tôi đã cập nhật câu trả lời .. cảm ơn vì đã chỉ ra – Amith

+2

'\' không phải là ký tự thoát trong mã hóa URL. –

0

tôi thấy có cùng một vấn đề với các ký tự: "\ vì vậy đó là những gì làm việc cho tôi:

var replaceChars={ '\\':'\\\\' , '"':'\\"' }; 
encodeURIComponent(str.replace(/\\|"/gi, function(matched){ 
    return replaceChars[matched]; 
})), 
0

này giúp tôi:

replace(/'/g, '%60') 

% 60 là `, nhưng bằng cách nào đó được định nghĩa là một dấu nháy đơn.

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