2012-01-12 3 views
1

Клиентские браузеры отправляют заголовок HTTP_ACCEPT_CHARSET: ISO-8859-1,utf-8;q=0.7,*;q=0.3. Я только обслуживаю веб-страницы как utf8 с правильным заголовком, но браузеры отправляют данные из форм, закодированных в кодировке ISO-8859-1. Мой вопрос в том, будет ли браузер всегда выбирать кодировки в порядке его заголовка ACCEPT_CHARSET, чтобы я мог надежно написать промежуточное программное обеспечение, которое будет декодировать любые опубликованные данные с первой записью, в этом случае ISO-8859-1, и закодировать ее как utf8.Браузер кодирует порядок приоритета

UPDATE:

Я обновил форму тег с accept-charset="utf-8" и я до сих пор видеть не-юникод появляться. Возможно ли, что пользователь скопирует/вставляет свой пароль из другого места (lastpass, excel file), может вводить символы, отличные от юникода?

ответ

2

Запрос заголовка Accept-Charset (который может получить отображаться на HTTP_ACCEPT_CHARSET стороне сервера) выражает предпочтения клиента, который будет использоваться, когда сервер способен обслужить ресурс в различных кодировках. Сервер может игнорировать его и часто будет.

Если ваша страница UTF-8 закодирована и объявлена ​​как таковая, любая форма на вашей странице отправит свои данные в кодировке UTF-8, если вы не указали атрибут accept-charset. Поэтому, если браузер отправляет данные по ISO-8859-1, то это ошибка браузера. Однако это необходимо проанализировать, прежде чем делать выводы.

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

+0

Так что, я думаю, у браузера есть ошибка. Он определенно не публикует данные как UTF8. Я добавил accept-charset, и я получаю согласованные результаты, если я просто использую HTTP_ACCEPT_CHARSET браузера в качестве указателя в случае ошибок. – Endophage

+0

Если это происходит в нескольких браузерах, возможно, есть другое объяснение. У вас есть или вы можете создать URL общедоступной страницы, демонстрирующий проблему? Я не могу его восстановить. Браузеры, как правило, отправляют заголовки Accept-Charset, как вы упомянули, хотя сама страница и передача данных формы являются UTF-8. Заголовок зависит от их конфигурации, а не от страницы. Я подозреваю, что может быть какой-то программный компонент (серверный), который выполняет преобразование кода до того, как данные достигнут вашего кода. –

+0

Я запускаюсь на Mac, и проблема, похоже, связана с тем, что пользователи Windows вводят символы, которые впоследствии кодируются в расширенных кодировках ascii, например «E» с острым акцентом, который кодируется как \ xC9, какие ошибки, когда он затем слепо обрабатывается как unicode в сервер. – Endophage

0

Я не уверен, что все браузеры всегда предпочитают кодировку в том же конкретном порядке, но вы можете установить accept-charset в форме, которая заставляет браузер отправлять данные, закодированные utf-8.

Как это:

<form accept-charset="utf-8"></form> 
+0

Это должно работать, но у меня было это изменение вживую в течение 4 дней, и я все еще получаю ошибку. – Endophage

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