2013-08-15 2 views
28

побег() функция устарела и заменяется encodeURIComponent но encodeURIComponent не кодирует одинарную кавычку/апостроф. Который мне нужно избегать апострофов в фамилии людей (например, «O'Neill») в форме AJAX. Почему они убрали способность чего-то, что они пытались улучшить?Почему encodeURIComponent не кодирует одинарные кавычки/апострофы?

EDIT:

Так вот пример кода, чтобы объяснить эту проблему более подробно. Таким образом, вы можете увидеть фамилию «O'Neill», которая содержит апостроф, который должен быть экранирован при передаче переменной в URL-адресе. Но это также произойдет и в других местах в форме, например, если введенный адрес - «Таверна Билли».

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

Мое текущее решение, используя пользовательскую функцию. Мой вопрос состоял в том, чтобы спросить, почему существует необходимость в специальной функции.

<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

Зачем вам нужно избегать апострофов? Если ваша конкретная потребность только в этом, просто замените. –

+3

Для чего им нужно бежать? – Bergi

+5

'encodeURIComponent' не кодирует символы' '', потому что символы '' 'не должны кодироваться в URI. – Quentin

ответ

38

encodeURIComponent ускользает все символы, кроме следующих:

алфавитных, десятичных цифр , - _. ! ~ * '()

Если вы хотите использовать кодировку, совместимый с RFC 3986 (который резервирует !, ', (, ) и *), вы можете использовать:

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

Вы можете получите дополнительную информацию об этом on MDN.

UPDATE:

Чтобы ответить на ваш вопрос, почему ' и другие символы, упомянутые выше, не кодируются encodeURIComponent, короткий ответ, что они только должны быть закодированы в определенных схем URI и решения для их кодирования зависит от используемой вами схемы.

Цитирую RFC 3986:

URI, продуцирующие приложения должны октета данных процентов закодировать, что соответствуют символам в reserved set если эти символы специально разрешены схемы URI для представления данных в этом компоненте. Если зарезервированный символ найден в компоненте URI, и для этого символа не известен , то он должен быть интерпретирован как представляющий октет данных, соответствующий этому кодированию символов в US-ASCII.

Где "зарезервирован набор" определяется как

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

апостроф в sub-delims группе. Другими словами, вы должны оставить эти символы незакодированными, если вы уверены, что потребляющие приложения будут знать, что с ними делать: например, если вы ошибочно закодировали ? и &, они больше не будут разграничивать детали запроса. Исторически было также предложение о параметрах сегментов пути, разделенных ; и , (не получило большого принятия), поэтому эти символы также разрешены. Это не то, что apostrohe является «свободно использовать» (т.е. unreserved) в данных URI, но он предположил, что это будет иметь какой-то особый смысл в контексте URI, к примеру segment часть:

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

Я отредактировал свое сообщение, чтобы показать свою текущую пользовательскую функцию, это не так тщательно, как ваша, но использует ту же идею. Спасибо за ваш ответ. –

+1

Единственная проблема с побегом заключается в том, что звездочка не закодирована. Это похоже на работу: encodeURIComponent (str) .replace (/ [! '() *]/G, function (c) {return'% '+ c.charCodeAt (0) .toString (16) .toUpperCase(); }); –

+0

На полпути эта страница представляет собой еще один пример использования кодировки RFC3986 с копией в паре: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/encodeURIComponent – mvdb

4

попробовать это

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

Синтаксис /char/g говорит JavaScript, чтобы заменить все вхождения в строке

+2

Я не знаю * любого * языка, который использует '/' в качестве escape-символа ... и вопрос ищет способ программно избежать символов, а не вручную. – Quentin

+0

Это была ошибка ввода, и я обновил ответ. Спасибо за указание – Amith

+2

'\' не является символом escape в кодировке URL. –

0

Я видел есть та же самая проблема с гольцов: " и \ так это то, что работает для меня:

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

это помогает мне:

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

% 60 is `, но каким-то образом определяется как одинарная кавычка.

Смежные вопросы