Подтвердить что ты не робот

Почему encodeURIComponent не кодирует одинарные кавычки/апострофы?

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

ИЗМЕНИТЬ:

Итак, вот пример кода, чтобы более подробно объяснить проблему. Таким образом, вы можете увидеть фамилию "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>
4b9b3361

Ответ 1

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

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

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

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

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

UPDATE:

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

Чтобы процитировать RFC 3986:

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

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

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

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

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

Ответ 2

попробуйте это

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

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

Ответ 3

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

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

Ответ 4

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

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

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