2010-04-09 4 views
0

Я думал, что значения, введенные в формы, правильно кодируются браузерами.Результат JS encodeURIComponent отличается от результата, созданного FORM

Но этот простой тестовый файл "test_get_vs_encodeuri.html" показывает, что это не так:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 
<html><head> 
    <meta http-equiv="Content-Type" content="text/html; charset=windows-1252"> 
    <title></title> 
</head><body> 

<form id="test" action="test_get_vs_encodeuri.html" method="GET" onsubmit="alert(encodeURIComponent(this.one.value));"> 
    <input name="one" type="text" value="Euro-€"> 
    <input type="submit" value="SUBMIT"> 
</form> 

</body></html> 

При ударе кнопку отправки:

encodeURICompenent кодирует значение входного сигнала в «Евро-% E2% 82% AC "

в то время как браузер в запрос GET пишет только простой "евро-% 80"

  1. Может ли кто-нибудь объяснить?

  2. Как кодировать все так же, как и FORM (windows-1252), используя Javascript ??? (функция выхода не работает, encodingURIComponent тоже не работает)?

Или может использоваться encodeURIComponent для ненужных преобразований?

ответ

5

Это проблема кодирования символов. В вашем документе используется кодировка Windows-1252, где находится в позиции 128, которая кодируется Windows-1252 как 0x80. Но encodeURICompenent ожидает, что вход будет UTF-8, таким образом, используя кодировку Unicode, где находится в позиции 8364 (PDF), которая кодируется UTF-8 0xE282AC.

Решение будет заключаться в использовании UTF-8 для вашего документа. Или вы пишете сопоставление для преобразования кодированных строк UTF-8 в Windows-1252.

+0

@Gumbo: спасибо, я понимаю сейчас. Но это заставляет меня задуматься над другим вопросом, который я уже задал, для чего полезен этот проклятый encodingURIComponent? Я имею в виду, что значение, закодированное FORM, не может быть ошибочным, даже если я использую cp1252, поэтому почему я должен использовать этот проклятый encodeURIComponent для кодирования URI, не могу ли я просто использовать простое escape-функцию JS, которое возвращает значения, идентичные закодированным по ФОРМ. Я знаю, что это может быть нехорошо, но в конце я предпочитаю кодировать вещи точно так же, как это делает FORM в браузере. http://stackoverflow.com/questions/2238515/encodeuricomponent-is-really-useful –

+0

@Marco Demaio: 'escape' имеет другой формат:' escape ("€") === "% u20AC" '. И что касается цели encodeURIComponent: Представьте, что вы хотите создать URI, который содержит значение '&' as (например, 'bar & baz'). '' ...? Foo = bar & baz "' даст два аргумента (* foo * и * baz *), потому что '&' является специальным символом. Но '' ...? Foo = "+ encodeURIComponent (" bar & baz ")' будет делать это. – Gumbo

+0

Извините, я не объяснил правильно, и я сказал мусор, я знаю, что мне нужно кодировать символы «&» в компоненте GET, но как я кодирую все так же, как и FORM с помощью cp1252 с помощью JS? Использование escape - это не так, но использование encodeURICompoenent - это не так, потому что e кодируется по-разному. Есть ли какая-нибудь функция в JS для этого? Извините, я также обновил вопрос. –

0

Я думаю, что корень проблемы - кодировка символов. Если бы я возиться с кодировкой в ​​мета-тег и сохранить файл с различными кодировками я могу получить страницу для отображения в браузере, как это:

Content encoding issue http://www.boogdesign.com/examples/encode/content-encoding-issue.png

Это € выглядит очень похоже на то, что вы получаете из encodeURIComponent. Однако я не мог найти комбинацию кодировок, которая имела какое-то значение для того, что возвращал encodeURIComponent. Я могу внести изменения в то, что возвращает запрос GET. This is your original page, подчиняясь дает URL, как:

test-get-vs-encodeuri.html?one=Euro-%80 

This is a UTF-8 version of the page, подчиняясь дает URL, который выглядит следующим образом (в Firefox):

http://www.boogdesign.com/examples/encode/test-get-vs-encodeuri-utf8.html?one=Euro-€ 

Но если скопировать и вставить его я получаю:

http://www.boogdesign.com/examples/encode/test-get-vs-encodeuri-utf8.html?one=Euro-%E2%82%AC 

Так выглядит, если страница UTF-8 совпадает с GET и encodeURIComponent.

+0

encodeURIComponent всегда принимает UTF-8. С http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-262.pdf: 15.1.3.4 \t encodeURIComponent (uriComponent) Функция encodeURIComponent вычисляет новую версию URI, в которой каждый экземпляр определенных символов заменяется одной, двумя или тремя escape-последовательностями, представляющими кодировку UTF-8 символа. –